Как программно остановить 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 ответ
Решение
Давайте разделим это на две части:
- Как удалить вертикалку
- Как общаться между вашей бизнес-логикой и 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();
}