From ccc4fbde7b21b69e35c5a184dd0dbbbe671df694 Mon Sep 17 00:00:00 2001 From: Kristian Kraljic Date: Fri, 12 Jan 2024 13:09:43 +0100 Subject: [PATCH] feat: add configuration to set default threading model for verticles --- .../config/NeonBeeConfigConverter.java | 8 +++++ .../java/io/neonbee/config/NeonBeeConfig.java | 31 +++++++++++++++++++ .../internal/deploy/DeployableVerticle.java | 5 +++ .../deploy/DeployableVerticleTest.java | 19 ++++++++++++ 4 files changed, 63 insertions(+) diff --git a/src/generated/java/io/neonbee/config/NeonBeeConfigConverter.java b/src/generated/java/io/neonbee/config/NeonBeeConfigConverter.java index ac43c2708..3e0de603a 100644 --- a/src/generated/java/io/neonbee/config/NeonBeeConfigConverter.java +++ b/src/generated/java/io/neonbee/config/NeonBeeConfigConverter.java @@ -19,6 +19,11 @@ public class NeonBeeConfigConverter { static void fromJson(Iterable> json, NeonBeeConfig obj) { for (java.util.Map.Entry member : json) { switch (member.getKey()) { + case "defaultThreadingModel": + if (member.getValue() instanceof String) { + obj.setDefaultThreadingModel(io.vertx.core.ThreadingModel.valueOf((String) member.getValue())); + } + break; case "deploymentTimeout": if (member.getValue() instanceof Number) { obj.setDeploymentTimeout(((Number) member.getValue()).intValue()); @@ -111,6 +116,9 @@ static void toJson(NeonBeeConfig obj, JsonObject json) { } static void toJson(NeonBeeConfig obj, java.util.Map json) { + if (obj.getDefaultThreadingModel() != null) { + json.put("defaultThreadingModel", obj.getDefaultThreadingModel().name()); + } json.put("deploymentTimeout", obj.getDeploymentTimeout()); if (obj.getEventBusCodecs() != null) { JsonObject map = new JsonObject(); diff --git a/src/main/java/io/neonbee/config/NeonBeeConfig.java b/src/main/java/io/neonbee/config/NeonBeeConfig.java index e46d8f55c..190122446 100644 --- a/src/main/java/io/neonbee/config/NeonBeeConfig.java +++ b/src/main/java/io/neonbee/config/NeonBeeConfig.java @@ -26,7 +26,9 @@ import io.vertx.codegen.annotations.DataObject; import io.vertx.codegen.annotations.Fluent; import io.vertx.codegen.json.annotations.JsonGen; +import io.vertx.core.DeploymentOptions; import io.vertx.core.Future; +import io.vertx.core.ThreadingModel; import io.vertx.core.Vertx; import io.vertx.core.json.JsonObject; import io.vertx.core.metrics.MetricsOptions; @@ -52,6 +54,11 @@ public class NeonBeeConfig { */ public static final int DEFAULT_DEPLOYMENT_TIMEOUT = 30; + /** + * The default threading model for deploying verticles (event loop). + */ + public static final ThreadingModel DEFAULT_THREADING_MODEL = DeploymentOptions.DEFAULT_MODE; + /** * The default tracking data handling strategy. */ @@ -75,6 +82,8 @@ public class NeonBeeConfig { private Integer verticleDeploymentTimeout; + private ThreadingModel defaultThreadingModel = DEFAULT_THREADING_MODEL; + private Map eventBusCodecs = Map.of(); private String trackingDataHandlingStrategy = DEFAULT_TRACKING_DATA_HANDLING_STRATEGY; @@ -362,6 +371,28 @@ public NeonBeeConfig setVerticleDeploymentTimeout(Integer verticleDeploymentTime return this; } + /** + * Get the default threading model to be used when deploying verticles. + * + * @return the default threading model for verticles + */ + public ThreadingModel getDefaultThreadingModel() { + return defaultThreadingModel; + } + + /** + * Set the default threading model to be used when deploying verticles. Can be overridden either on runtime or using + * the verticle configuration. + * + * @param threadingModel the threading model to use when deploying verticles + * @return the {@linkplain NeonBeeConfig} for fluent use + */ + @Fluent + public NeonBeeConfig setDefaultThreadingModel(ThreadingModel threadingModel) { + this.defaultThreadingModel = threadingModel; + return this; + } + /** * Gets a list of default codecs to register on the event bus. *

diff --git a/src/main/java/io/neonbee/internal/deploy/DeployableVerticle.java b/src/main/java/io/neonbee/internal/deploy/DeployableVerticle.java index da203a961..894481fc4 100644 --- a/src/main/java/io/neonbee/internal/deploy/DeployableVerticle.java +++ b/src/main/java/io/neonbee/internal/deploy/DeployableVerticle.java @@ -251,6 +251,11 @@ static Future readVerticleConfig(Vertx vertx, String classNam : config; // if there is no default config, or what we read was the default config return it }).onFailure(throwable -> { LOGGER.warn("Could not read deployment options for deployable {}", className, throwable); + }).onSuccess(config -> { + if (!config.containsKey("threadingModel")) { + config.put("threadingModel", NeonBee.get(vertx).getConfig() + .getDefaultThreadingModel().toString()); + } }).map(DeploymentOptions::new); } } diff --git a/src/test/java/io/neonbee/internal/deploy/DeployableVerticleTest.java b/src/test/java/io/neonbee/internal/deploy/DeployableVerticleTest.java index 69b47d1f1..566d21836 100644 --- a/src/test/java/io/neonbee/internal/deploy/DeployableVerticleTest.java +++ b/src/test/java/io/neonbee/internal/deploy/DeployableVerticleTest.java @@ -34,6 +34,7 @@ import io.neonbee.internal.scanner.ClassPathScanner; import io.vertx.core.DeploymentOptions; import io.vertx.core.Future; +import io.vertx.core.ThreadingModel; import io.vertx.core.Verticle; import io.vertx.core.Vertx; import io.vertx.core.buffer.Buffer; @@ -206,6 +207,24 @@ void testReadVerticleConfigFailure() throws IOException { .isEqualTo("test"); } + @Test + @DisplayName("test read verticle config threading model") + void testReadVerticleConfigThreadingModel() throws IOException { + NeonBee neonBeeMock = newNeonBeeMockForDeployment( + new NeonBeeOptions.Mutable().setWorkingDirectory(Path.of(""))); + Vertx vertxMock = neonBeeMock.getVertx(); + FileSystem fileSystemMock = vertxMock.fileSystem(); + + when(fileSystemMock.readFile(any())) + .thenReturn(failedFuture(new FileSystemException(new NoSuchFileException("file")))); + when(fileSystemMock.readFile(endsWith(".yml"))) + .thenReturn(succeededFuture(Buffer.buffer("---\nthreadingModel: WORKER"))); + + JsonObject defaultObject = new JsonObject().put("threadingModel", "EVENT_LOOP"); + assertThat(DeployableVerticle.readVerticleConfig(vertxMock, "test", defaultObject).result().toJson()) + .isEqualTo(new DeploymentOptions().setThreadingModel(ThreadingModel.WORKER).toJson()); + } + @Test @DisplayName("test scan class path") @SuppressWarnings("rawtypes")