代码之家  ›  专栏  ›  技术社区  ›  junglie85

垂直。x undeploy verticle引发IllegalStateException未知部署

  •  1
  • junglie85  · 技术社区  · 8 年前

    查看Vert的日志。在x应用程序中,我在取消部署verticles时注意到以下异常(所有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
    

    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是说部署未知?

    1 回复  |  直到 8 年前
        1
  •  0
  •   michalsamek    8 年前

    从…起 Vert.x specs

    stop() MasterMicroserviceVerticle 正在取消部署,其他已取消部署。