如何以编程方式停止 Vert.x Verticle?
How to programmatically stop a Vert.x 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 方面有更多经验,知道如何实现它?或者也许有人会建议我用什么替代方法来正确地做到这一点?
让我们把它分成两部分:
- 如何取消部署 Verticle
- 如何在您的业务逻辑与 VertX 之间进行通信
这是一个 Verticle 在 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();
}
假设我有一个类似这样的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 方面有更多经验,知道如何实现它?或者也许有人会建议我用什么替代方法来正确地做到这一点?
让我们把它分成两部分:
- 如何取消部署 Verticle
- 如何在您的业务逻辑与 VertX 之间进行通信
这是一个 Verticle 在 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();
}