Java Vert.x取消部署verticle引发IllegalStateException未知部署

Java Vert.x取消部署verticle引发IllegalStateException未知部署,java,vert.x,Java,Vert.x,通过查看Vert.x应用程序的日志,我注意到在取消部署verticles时出现了以下异常(所有3个都是相同的异常): 但是,它们都已部署并具有部署ID: Deployed: 213f1978-a595-4af1-8129-29de872e9907 Deployed: e46839f1-2dd2-4cce-9e12-66e09677b97a Deployed: 8fdfd492-e005-4503-875e-13d73c633b2c 部署ID存储在同步映射中,verticle类作为键,部署ID作

通过查看Vert.x应用程序的日志,我注意到在取消部署verticles时出现了以下异常(所有3个都是相同的异常):

但是,它们都已部署并具有部署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正在传递到取消部署的调用中:

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;
  }
}
公共抽象类MasterMicroserviceVerticle扩展了MicroserviceVerticle{
私人最终地图支持垂直线=
Collections.synchronizedMap(新的HashMap());
...
私有未来部署支持verticle(垂直类){
Future=Future.Future();
垂直(
verticle.getName(),
新建DeploymentOptions().setConfig(config()),
异步结果->{
if(asyncResult.successed()){
//将部署ID分配给垂直映射。
String depId=asyncResult.result();
System.out.println();
System.out.println();
系统输出打印项次(部门ID);
System.out.println();
System.out.println();
支撑垂直。放置(垂直,深度);
setHealth(verticle.getName(),HealthStatus.PASSING);
info(“Deployed{}”,verticle.getName());
future.complete();
}否则{
healthStatusService.setHealth(verticle.getName(),HealthStatus.FAILING);
logger.error(“部署{}失败”,verticle.getName(),asyncResult.cause());
future.fail(asyncResult.cause());
}
});
回归未来;
}
...
@凌驾
公共void stop(Future stopFuture)引发异常{
System.out.println();
System.out.println();
System.out.println();
System.out.println();
System.out.println();
对于(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();
...
回归现实;
}).compose(处理程序->{
Future-verticlesFuture=Future.Future();
停止支持Verticles(verticlesFuture.completer());
回归垂直未来;
}).compose(处理程序->
logger.info(“未部署的服务”);
stopFuture.completer();
},即未来);
}
受保护的void stopSupportingVerticles(处理程序){
列表不可部署=支持垂直链接
.keySet()
.stream()
.map(此::取消部署支持垂直)
.collect(Collectors.toList());
CompositeFuture.all(不可部署)
.setHandler(异步结果->{
if(asyncResult.successed()){
handler.handle(Future.succeededFuture());
}否则{
handler.handle(Future.failedFuture(asyncResult.cause());
}
});
}
私有未来取消部署支持垂直(类垂直){
Future=Future.Future();
System.out.println();
System.out.println();
System.out.println(“取消部署:+supportingVerticles.get(verticle));
System.out.println();
System.out.println();
取消部署(支持verticle.get(verticle),asyncResult->{
healthStatusService.setHealth(verticle.getName(),HealthStatus.FAILING);
if(asyncResult.successed()){
info(“未部署的{}”,verticle.getName());
future.complete();
}否则{
logger.error(“未能取消部署{}”,verticle.getName(),asyncResult.cause());
future.fail(asyncResult.cause());
}
});
回归未来;
}
}
请原谅所有的
System.out.println()
,我把它们放在那里是为了帮助我更好地了解正在发生的事情,可能应该在日志中记录这些信息。但就目前而言,如果有人能帮助我理解为什么Vert.x说部署是未知的,我将不胜感激

在verticle的stop方法中,不需要手动取消部署由verticle启动的子verticle。当父垂直轴取消部署时,Vert.x将自动取消部署任何子垂直轴

您可以通过覆盖子垂直线中的
stop()
方法来验证这一点。我想说的是,当
MasterMicroserviceVerticle
取消部署时,其他的已经取消部署。

来自:

在verticle的stop方法中,不需要手动取消部署由verticle启动的子verticle。当父垂直轴取消部署时,Vert.x将自动取消部署任何子垂直轴


您可以通过覆盖子垂直线中的
stop()
方法来验证这一点。我想说的是,当
MasterMicroserviceVerticle
被取消部署时,其他的都已经取消了部署。

如果我想控制停止顺序,以确保在其他verticle关闭之前完成所有剩余的工作,这就是为什么我要覆盖
stop()
并调用undeploy。我不调用
super.stop()
,因此如何防止Vert.x自动取消部署它们?我不确定您是否可以控制取消部署顺序。如果查看
io.vertx.core.impl.DeploymentManager.DeploymentImpl#doUndeploy
,您可以看到所有子垂直轴都会在其父垂直轴之前自动取消部署。如果还有一些工作要做,也许你可以检查你的孩子的垂直图,只有在剩余的工作完成后才能完成
stopFuture
。在工作完成之前,我不会完成stopFuture。我打电话给

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