Suppose I have a verticle somewhat like this (intentionally simplified to make it easier to explain my question).
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());
}
}
Now imagine that MyService
is event driven, and I would like to stop the verticle when certain event happens in the service.
class MyService {
public void onEvent(Event event) {
//here force the service to stop and its associated verticle too
}
}
Does anyone with more experience with Vert.x knows how to accomplish that? Or perhaps some advise for me on what is an alternative way to do this right?
Let's divide this into two parts:
Here's an example of a verticle undeploying itself after 5 seconds.
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");
}
}
You simply call undeploy()
with verticle identifier: deploymentID()
.
Now, you don't want to pass your VertX instance to your service for sure.
Instead, you can have interface:
interface UndeployableVerticle {
void undeploy();
}
That you implement and pass to your service:
public class ServiceVerticle extends AbstractVerticle implements UndeployableVerticle {
private MyService myService = new MyService(this);
...
}
Then call it like so:
public void onEvent(Event event) {
this.verticle.undeploy();
}