From 8755db2707688d743960ef3d1a63019b1867f50b Mon Sep 17 00:00:00 2001 From: Clement Escoffier Date: Fri, 14 Feb 2020 11:54:18 +0100 Subject: [PATCH] Document verticle support Also add a test verifying that verticle instances can be beans. --- docs/src/main/asciidoc/vertx.adoc | 86 +++++++++++++++++++ .../vertx/verticles/MyBeanVerticle.java | 22 +++++ .../vertx/verticles/VerticleDeployer.java | 16 ++++ .../verticles/VerticleDeploymentTest.java | 36 ++++++++ 4 files changed, 160 insertions(+) create mode 100644 extensions/vertx/deployment/src/test/java/io/quarkus/vertx/verticles/MyBeanVerticle.java create mode 100644 extensions/vertx/deployment/src/test/java/io/quarkus/vertx/verticles/VerticleDeployer.java create mode 100644 extensions/vertx/deployment/src/test/java/io/quarkus/vertx/verticles/VerticleDeploymentTest.java diff --git a/docs/src/main/asciidoc/vertx.adoc b/docs/src/main/asciidoc/vertx.adoc index 59ace7f08..24cc63e84 100644 --- a/docs/src/main/asciidoc/vertx.adoc +++ b/docs/src/main/asciidoc/vertx.adoc @@ -498,6 +498,92 @@ Then, create the native executable with: ./mvnw package -Pnative ---- +== Deploying verticles + +https://vertx.io/docs/vertx-core/java/#_verticles[Verticles] is "a simple, scalable, actor-like deployment and concurrency model" provided by _Vert.x_. +This model does not claim to be a strict actor-model implementation, but it does share similarities especially with respect to concurrency, scaling and deployment. +To use this model, you write and _deploy_ verticles, communicating with each other by sending messages on the event bus. + +You can deploy _verticles_ in Quarkus. +It supports: + +* _bare_ verticle - Java classes extending `io.vertx.core.AbstractVerticle` +* _Mutiny_ verticle - Java classes extending `io.smallrye.mutiny.vertx.core.AbstractVerticle` + +To deploy verticles, use the regular Vert.x API: + +[source, java] +==== +@Inject Vertx vertx; + +// ... +vertx.deployVerticle(MyVerticle.class.getName(), ar -> { }); +vertx.deployVerticle(new MyVerticle(), ar -> { }); +==== + +You can also pass deployment options to configure the verticle as well as set the number of instances. + +Verticles are not _beans_ by default. +However, you can implement them as _ApplicationScoped_ beans and get injection support: + +[source, java] +==== +package io.quarkus.vertx.verticles; + +import io.smallrye.mutiny.Uni; +import io.smallrye.mutiny.vertx.core.AbstractVerticle; +import org.eclipse.microprofile.config.inject.ConfigProperty; + +import javax.enterprise.context.ApplicationScoped; + +@ApplicationScoped +public class MyBeanVerticle extends AbstractVerticle { + + @ConfigProperty(name = "address") String address; + + @Override + public Uni asyncStart() { + return vertx.eventBus().consumer(address) + .handler(m -> m.replyAndForget("hello")) + .completionHandler(); + } +} +==== + +You don't have to inject the `vertx` instance but instead leverage the instance stored in the protected field of `AbstractVerticle`. + +Then, deploy the verticle instance with: + +[source, java] +==== +package io.quarkus.vertx.verticles; + +import io.quarkus.runtime.StartupEvent; +import io.vertx.mutiny.core.Vertx; + +import javax.enterprise.context.ApplicationScoped; +import javax.enterprise.event.Observes; + +@ApplicationScoped +public class VerticleDeployer { + + public void init(@Observes StartupEvent e, Vertx vertx, MyBeanVerticle verticle) { + vertx.deployVerticle(verticle).await().indefinitely(); + } +} +==== + +If you want to deploy every exposed `AbstractVerticle`, you can use: + +[source, java] +==== +public void init(@Observes StartupEvent e, Vertx vertx, Instance verticles) { + for (AbstractVerticle verticle : verticles) { + vertx.deployVerticle(verticle).await().indefinitely(); + } +} +==== + == Read only deployment environments In environments with read only file systems you may receive errors of the form: diff --git a/extensions/vertx/deployment/src/test/java/io/quarkus/vertx/verticles/MyBeanVerticle.java b/extensions/vertx/deployment/src/test/java/io/quarkus/vertx/verticles/MyBeanVerticle.java new file mode 100644 index 000000000..26fdf8699 --- /dev/null +++ b/extensions/vertx/deployment/src/test/java/io/quarkus/vertx/verticles/MyBeanVerticle.java @@ -0,0 +1,22 @@ +package io.quarkus.vertx.verticles; + +import javax.enterprise.context.ApplicationScoped; + +import org.eclipse.microprofile.config.inject.ConfigProperty; + +import io.smallrye.mutiny.Uni; +import io.smallrye.mutiny.vertx.core.AbstractVerticle; + +@ApplicationScoped +public class MyBeanVerticle extends AbstractVerticle { + + @ConfigProperty(name = "address") + String address; + + @Override + public Uni asyncStart() { + return vertx.eventBus().consumer(address) + .handler(m -> m.replyAndForget("hello")) + .completionHandler(); + } +} diff --git a/extensions/vertx/deployment/src/test/java/io/quarkus/vertx/verticles/VerticleDeployer.java b/extensions/vertx/deployment/src/test/java/io/quarkus/vertx/verticles/VerticleDeployer.java new file mode 100644 index 000000000..21af385a2 --- /dev/null +++ b/extensions/vertx/deployment/src/test/java/io/quarkus/vertx/verticles/VerticleDeployer.java @@ -0,0 +1,16 @@ +package io.quarkus.vertx.verticles; + +import javax.enterprise.context.ApplicationScoped; +import javax.enterprise.event.Observes; + +import io.quarkus.runtime.StartupEvent; +import io.vertx.mutiny.core.Vertx; + +@ApplicationScoped +public class VerticleDeployer { + + void deploy(@Observes StartupEvent event, Vertx vertx, MyBeanVerticle verticle) { + vertx.deployVerticle(verticle).await().indefinitely(); + } + +} diff --git a/extensions/vertx/deployment/src/test/java/io/quarkus/vertx/verticles/VerticleDeploymentTest.java b/extensions/vertx/deployment/src/test/java/io/quarkus/vertx/verticles/VerticleDeploymentTest.java new file mode 100644 index 000000000..3170b2408 --- /dev/null +++ b/extensions/vertx/deployment/src/test/java/io/quarkus/vertx/verticles/VerticleDeploymentTest.java @@ -0,0 +1,36 @@ +package io.quarkus.vertx.verticles; + +import static org.assertj.core.api.Assertions.assertThat; + +import javax.inject.Inject; + +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.asset.StringAsset; +import org.jboss.shrinkwrap.api.spec.JavaArchive; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import io.quarkus.test.QuarkusUnitTest; +import io.vertx.mutiny.core.Vertx; +import io.vertx.mutiny.core.eventbus.Message; + +public class VerticleDeploymentTest { + + @RegisterExtension + static final QuarkusUnitTest config = new QuarkusUnitTest() + .setArchiveProducer(() -> ShrinkWrap + .create(JavaArchive.class) + .addClasses(MyBeanVerticle.class, VerticleDeployer.class) + .addAsResource(new StringAsset("address=foo"), "application.properties")); + + @Inject + Vertx vertx; + + @Test + public void test() { + String s = vertx.eventBus(). request("foo", "anyone?") + .onItem().apply(Message::body) + .await().indefinitely(); + assertThat(s).isEqualTo("hello"); + } +}