In previous examples of implementations of AbstractVerticle classes I’ve used start and stop methods which take no arguments, there’s actually asynchronous versions of these methods which support the Vert.x Future class.
For example
public class FutureVerticle extends AbstractVerticle { @Override public void start(Future<Void> future) { } @Override public void stop(Future<Void> future) { } }
Let’s take a look at how our start method might change to use futures.
@Override public void start(Future<Void> future) { // routing and/or initialization code vertx.createHttpServer() .requestHandler(router::accept) .listen(port, l -> { if(l.succeeded()) { future.succeeded(); } else { future.fail(l.cause()); } }); )
In this example we simply set the state of the future to success or failure and in the case of the failure supply a Throwable as the argument to the fail method.
Using the Future in our own code
Obviously the Future class may be used outside of the start and stop methods, so let’s take a look at creating and using a Future.
To create a future simply use
Future<Record> f = Future.future();
in this case we’re creating a Future which takes a Record. We can now supply our own AsyncResult
Future<Record> f = Future.future(); f.setHandler(ar -> { if(r.succeeded() { // do something with result } });
Many of the Vertx methods (like listen in the earlier code) supply overloads with an AsyncResult callback. We can pass a future as a callback using the method completer and supply a handler via the future. For example
Future<HttpServer> f = Future.future(); f.setHandler(l -> { if(l.succeeded()) { future.succeeded(); } else { future.fail(l.cause()); } }); vertx.createHttpServer() .requestHandler(router::accept) .listen(port, f.completer());