简体   繁体   中英

Vert.x undeploy verticle throws IllegalStateException Unknown deployment

Looking through the logs of a Vert.x application, I noticed the following exception when undeploying verticles (it's the same exception for all 3):

Failed to undeploy netsci.graphservice.verticles.CommandVerticle
Failed to undeploy netsci.graphservice.verticles.QueryVerticle
Failed to undeploy netsci.graphservice.verticles.EventVerticle
java.lang.IllegalStateException: Unknown deployment
    at io.vertx.core.impl.DeploymentManager.undeployVerticle(DeploymentManager.java:203)
    at io.vertx.core.impl.VertxImpl.undeploy(VertxImpl.java:616)
    at microservice.MasterMicroserviceVerticle.undeploySupportingVerticle(MasterMicroserviceVerticle.java:462)
    at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
    at java.util.HashMap$KeySpliterator.forEachRemaining(HashMap.java:1548)
    at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
    at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
    at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
    at microservice.MasterMicroserviceVerticle.stopSupportingVerticles(MasterMicroserviceVerticle.java:433)
    at microservice.MasterMicroserviceVerticle.lambda$stop$14(MasterMicroserviceVerticle.java:383)
    at io.vertx.core.Future.lambda$compose$1(Future.java:270)
    at io.vertx.core.impl.FutureImpl.tryComplete(FutureImpl.java:126)
    at io.vertx.core.impl.FutureImpl.complete(FutureImpl.java:88)
    at io.vertx.core.impl.FutureImpl.handle(FutureImpl.java:152)
    at io.vertx.core.impl.FutureImpl.handle(FutureImpl.java:23)
    at io.vertx.core.impl.FutureImpl.setHandler(FutureImpl.java:81)
    at io.vertx.core.Future.lambda$compose$1(Future.java:275)
    at io.vertx.core.impl.FutureImpl.tryComplete(FutureImpl.java:126)
    at io.vertx.core.impl.FutureImpl.complete(FutureImpl.java:88)
    at io.vertx.core.impl.FutureImpl.handle(FutureImpl.java:152)
    at io.vertx.core.impl.FutureImpl.handle(FutureImpl.java:23)
    at io.vertx.core.impl.FutureImpl.tryComplete(FutureImpl.java:126)
    at io.vertx.core.impl.FutureImpl.tryComplete(FutureImpl.java:133)
    at io.vertx.core.impl.FutureImpl.complete(FutureImpl.java:95)
    at microservice.MasterMicroserviceVerticle.lambda$null$11(MasterMicroserviceVerticle.java:363)
    at microservice.messaging.impl.BufferKafkaProducerService.lambda$shutdown$2(BufferKafkaProducerService.java:97)
    at io.vertx.core.impl.FutureImpl.setHandler(FutureImpl.java:81)
    at io.vertx.core.impl.ContextImpl.lambda$null$0(ContextImpl.java:287)
    at io.vertx.core.impl.ContextImpl.lambda$wrapTask$2(ContextImpl.java:337)
    at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163)
    at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:403)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:445)
    at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858)
    at java.lang.Thread.run(Thread.java:748)

However, they are all deployed and have a deployment ID:

Deployed: 213f1978-a595-4af1-8129-29de872e9907
Deployed: e46839f1-2dd2-4cce-9e12-66e09677b97a
Deployed: 8fdfd492-e005-4503-875e-13d73c633b2c

The deployment ID's are stored in a synchronized map, with the verticle class as the key and the the deployment id as the value. When queried, it shows that they are correctly stored:

class netsci.graphservice.verticles.QueryVerticle: e46839f1-2dd2-4cce-9e12-66e09677b97a
class netsci.graphservice.verticles.CommandVerticle: 8fdfd492-e005-4503-875e-13d73c633b2c
class netsci.graphservice.verticles.EventVerticle: 213f1978-a595-4af1-8129-29de872e9907

Prior to the call to endeploy, if I check which verticle is being undeployed, I get can see that the valid deployment ID is being passed into the call to undeploy:

Undeploying: e46839f1-2dd2-4cce-9e12-66e09677b97a
Undeploying: 8fdfd492-e005-4503-875e-13d73c633b2c
Undeploying: 213f1978-a595-4af1-8129-29de872e9907

Here are the relevant bits of code:

public abstract class MasterMicroserviceVerticle extends MicroserviceVerticle {

  private final Map<Class, String> supportingVerticles =
      Collections.synchronizedMap(new HashMap<Class, String>());

  ...

  private Future<Void> deploySupportingVerticle(Class verticle) {

    Future<Void> future = Future.future();

    vertx.deployVerticle(
        verticle.getName(),
        new DeploymentOptions().setConfig(config()),
        asyncResult -> {
          if (asyncResult.succeeded()) {
            // Assign deployment ID to verticle map.
            String depId = asyncResult.result();
            System.out.println();
            System.out.println();
            System.out.println(depId);
            System.out.println();
            System.out.println();
            supportingVerticles.put(verticle, depId);
            healthStatusService.setHealth(verticle.getName(), HealthStatus.PASSING);
            logger.info("Deployed {}", verticle.getName());
            future.complete();
          } else {
            healthStatusService.setHealth(verticle.getName(), HealthStatus.FAILING);
            logger.error("Failed to deploy {}", verticle.getName(), asyncResult.cause());
            future.fail(asyncResult.cause());
          }
        });

    return future;
  }

  ...

  @Override
  public void stop(Future<Void> stopFuture) throws Exception {

    System.out.println();
    System.out.println();
    System.out.println();
    System.out.println();
    System.out.println();
    for (Class c : supportingVerticles.keySet()) {
      System.out.println(c + ": " + supportingVerticles.get(c));
    }
    System.out.println();
    System.out.println();
    System.out.println();
    System.out.println();
    System.out.println();
    ...
      return mongoFuture;
    }).compose(handler -> {
      Future<Void> verticlesFuture = Future.future();

      stopSupportingVerticles(verticlesFuture.completer());

      return verticlesFuture;
    }).compose(handler ->
      logger.info("Undeployed service");
      stopFuture.completer();
    }, stopFuture);
  }

  protected void stopSupportingVerticles(Handler<AsyncResult<Void>> handler) {

    List<Future> undeployable = supportingVerticles
        .keySet()
        .stream()
        .map(this::undeploySupportingVerticle)
        .collect(Collectors.toList());

    CompositeFuture.all(undeployable)
        .setHandler(asyncResult -> {
          if (asyncResult.succeeded()) {
            handler.handle(Future.succeededFuture());
          } else {
            handler.handle(Future.failedFuture(asyncResult.cause()));
          }
        });
  }

  private Future<Void> undeploySupportingVerticle(Class verticle) {

    Future<Void> future = Future.future();

    System.out.println();
    System.out.println();
    System.out.println("Undeploying: " + supportingVerticles.get(verticle));
    System.out.println();
    System.out.println();
    vertx.undeploy(supportingVerticles.get(verticle), asyncResult -> {
      healthStatusService.setHealth(verticle.getName(), HealthStatus.FAILING);
      if (asyncResult.succeeded()) {
        logger.info("Undeployed {}", verticle.getName());
        future.complete();
      } else {
        logger.error("Failed to undeploy {}", verticle.getName(), asyncResult.cause());
        future.fail(asyncResult.cause());
      }
    });

    return future;
  }
}

Please excuse all the System.out.println() 's, I've thrown them in there to help me get a better idea of what's going on and should probably record this info in the logs. But for now, I'd just appreciate any help understanding why Vert.x is saying the deployments are unknown?

From Vert.x specs :

You don't need to manually undeploy child verticles started by a verticle, in the verticle's stop method. Vert.x will automatically undeploy any child verticles when the parent is undeployed.

You can verify this by overriding the stop() method in the child verticles. I would say, that at the time when MasterMicroserviceVerticle is being undeployed, the other ones are already undeployed.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM