如何以编程方式停止Vert.x Verticle?

时间:2018-03-11 10:48:24

标签: java vert.x vertx-verticle

假设我有一个像这样的Verticle(故意简化以便更容易解释我的问题)。

public class ServiceVerticle extends AbstractVerticle {

   private MyService myService = new MyService();

   public void start(Future<Void> startFuture) {
      myService.start().addListener(done -> startFuture.complete());
   }

   public void stop(Future<Void> stopFuture) {
      myService.stop().addListener(done -> stopFuture.complete());
   }
}

现在假设MyService是事件驱动的,我想在服务中发生某些事件时停止Verticle。

class MyService {

   public void onEvent(Event event) {
        //here force the service to stop and its associated verticle too
   }
}

对Vert.x有更多经验的人是否知道如何实现这一目标?或者也许有人会告诉我什么是另一种方法来做到这一点?

1 个答案:

答案 0 :(得分:2)

我们将其分为两部分:

  1. 如何取消部署Verticle
  2. 如何在业务逻辑与VertX之间进行通信
  3. 这是一个在5秒后取消展开的Verticle示例。

    class StoppingVerticle extends AbstractVerticle {
    
        @Override
        public void start() {
    
            System.out.println("Starting");
            vertx.setTimer(TimeUnit.SECONDS.toMillis(5), (h) -> {
                vertx.undeploy(deploymentID());
            });
        }
    
        @Override
        public void stop() {
            System.out.println("Stopping");
        }
    }
    

    您只需使用垂直标识符undeploy()调用deploymentID()

    现在,您不希望将VertX实例传递给您的服务 相反,你可以有界面:

    interface UndeployableVerticle {
        void undeploy();
    }
    

    您实施并传递给您的服务:

    public class ServiceVerticle extends AbstractVerticle implements UndeployableVerticle  {
    
       private MyService myService = new MyService(this);
    
       ...
    }
    

    然后这样称呼它:

    public void onEvent(Event event) {
       this.verticle.undeploy();
    }