簡體   English   中英

Vert.x取消部署頂點拋出IllegalStateException未知部署

[英]Vert.x undeploy verticle throws IllegalStateException Unknown deployment

瀏覽Vert.x應用程序的日志時,在取消部署verticle時,我注意到以下異常(對於所有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)

但是,它們都已部署並且具有部署ID:

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

部署ID存儲在一個同步映射中,其中verticle類為鍵,而部署ID為值。 查詢時,表明它們已正確存儲:

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

在調用endeploy之前,如果我檢查正在取消部署哪個頂點,則可以看到有效的部署ID正在傳遞到undeploy調用中:

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

以下是相關的代碼位:

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;
  }
}

請原諒所有System.out.println() ,我將它們扔在那里,以幫助我更好地了解正在發生的事情,並且可能應該將此信息記錄在日志中。 但就目前而言,我將不勝感激能幫助您理解為什么Vert.x表示未知的部署?

Vert.x規格

您無需通過verticle的stop方法手動取消部署由verticle開始的子verticle。 取消部署父級時,Vert.x會自動取消部署所有子頂點。

您可以通過覆蓋子頂點中的stop()方法來驗證這一點。 我要說的是,在取消部署MasterMicroserviceVerticle時,其他的已被取消部署。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM