Как программно остановить Vert.x Veriment?

Предположим, у меня есть такая вертикаль (намеренно упрощенная, чтобы было проще объяснить мой вопрос).

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 управляется событиями, и я хотел бы остановить вертикалку, когда в сервисе происходит определенное событие.

class MyService {

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

Кто-нибудь с большим опытом работы с Vert.x знает, как этого добиться? Или, может быть, мне посоветуют какой альтернативный способ сделать это правильно?

1 ответ

Решение

Давайте разделим это на две части:

  1. Как удалить вертикалку
  2. Как общаться между вашей бизнес-логикой и VertX

Вот пример того, как вертикал разрушается через 5 секунд.

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();
}
Другие вопросы по тегам