diff --git a/.gitignore b/.gitignore index 26d44a9eb46..7e5ab738d2f 100644 --- a/.gitignore +++ b/.gitignore @@ -20,5 +20,6 @@ faces-config.NavData *.lock.db **/overlays **/node_modules +camunda-h2-dbs *.DS_Store diff --git a/engine/src/main/java/org/camunda/bpm/container/impl/metadata/PropertyHelper.java b/engine/src/main/java/org/camunda/bpm/container/impl/metadata/PropertyHelper.java index 32dd91a490f..5bed8761662 100644 --- a/engine/src/main/java/org/camunda/bpm/container/impl/metadata/PropertyHelper.java +++ b/engine/src/main/java/org/camunda/bpm/container/impl/metadata/PropertyHelper.java @@ -34,7 +34,11 @@ */ public class PropertyHelper { - private final static ContainerIntegrationLogger LOG = ProcessEngineLogger.CONTAINER_INTEGRATION_LOGGER; + protected final static ContainerIntegrationLogger LOG = ProcessEngineLogger.CONTAINER_INTEGRATION_LOGGER; + + public static final String KEBAB_CASE = "-"; + public static final String SNAKE_CASE = "_"; + public static final String CAMEL_CASE = ""; /** * Regex for Ant-style property placeholders @@ -99,18 +103,38 @@ public static void applyProperty(Object configuration, String key, String string /** * Sets an objects fields via reflection from String values. * Depending on the field's type the respective values are converted to int or boolean. + * This method allows to specify a property naming strategy, i.e., if a property is written in + * camelCase, kebab-case, or snake_case. * * @param configuration * @param properties + * @param namingStrategy can be either {@link PropertyHelper#KEBAB_CASE}, {@link PropertyHelper#SNAKE_CASE}, or {@link PropertyHelper#CAMEL_CASE}. * @throws ProcessEngineException if a property is supplied that matches no field or * if the field's type is not String, nor int, nor boolean. */ - public static void applyProperties(Object configuration, Map properties) { + public static void applyProperties(Object configuration, Map properties, String namingStrategy) { for (Map.Entry property : properties.entrySet()) { - applyProperty(configuration, property.getKey(), property.getValue()); + String key = property.getKey(); + if (!CAMEL_CASE.equals(namingStrategy)) { + key = convertToCamelCase(key, namingStrategy); + } + applyProperty(configuration, key, property.getValue()); } } + /** + * Sets an objects fields via reflection from String values. + * Depending on the field's type the respective values are converted to int or boolean. + * + * @param configuration + * @param properties + * @throws ProcessEngineException if a property is supplied that matches no field or + * if the field's type is not String, nor int, nor boolean. + */ + public static void applyProperties(Object configuration, Map properties) { + applyProperties(configuration, properties, CAMEL_CASE); + } + /** * Replaces Ant-style property references if the corresponding keys exist in the provided {@link Properties}. @@ -133,4 +157,13 @@ public static String resolveProperty(Properties props, String original) { return found ? buffer.toString() : original; } + protected static String convertToCamelCase(String value, String token) { + while(value.contains(token)) { + value = value + .replaceFirst(token + "[a-z]", + String.valueOf(Character.toUpperCase(value.charAt(value.indexOf(token) + 1)))); + } + return value; + } + } diff --git a/engine/src/test/java/org/camunda/bpm/container/impl/metadata/PropertyHelperTest.java b/engine/src/test/java/org/camunda/bpm/container/impl/metadata/PropertyHelperTest.java index 097a1ab9292..a591101d96f 100644 --- a/engine/src/test/java/org/camunda/bpm/container/impl/metadata/PropertyHelperTest.java +++ b/engine/src/test/java/org/camunda/bpm/container/impl/metadata/PropertyHelperTest.java @@ -20,7 +20,6 @@ import java.util.Map; import java.util.Properties; -import junit.framework.TestCase; import org.camunda.bpm.engine.ProcessEngineConfiguration; import org.camunda.bpm.engine.impl.cfg.ProcessEngineConfigurationImpl; import org.camunda.bpm.engine.impl.cfg.StandaloneProcessEngineConfiguration; @@ -48,6 +47,18 @@ public class PropertyHelperTest { protected static final String WAIT_INCREASE_FACTOR = "waitIncreaseFactor"; protected static final String BACKOFF_TIME_IN_MILLIS = "backoffTimeInMillis"; + // kebab case properties + protected static final String KC_JDBC_URL_PROP = "jdbc-url"; + protected static final String KC_DB_IDENTITY_USED_PROP = "db-identity-used"; + protected static final String KC_WAIT_INCREASE_FACTOR = "wait-increase-factor"; + protected static final String KC_BACKOFF_TIME_IN_MILLIS = "backoff-time-in-millis"; + + // snake case properties + protected static final String SC_JDBC_URL_PROP = "jdbc_url"; + protected static final String SC_DB_IDENTITY_USED_PROP = "db_identity_used"; + protected static final String SC_WAIT_INCREASE_FACTOR = "wait_increase_factor"; + protected static final String SC_BACKOFF_TIME_IN_MILLIS = "backoff_time_in_millis"; + /** * Assert that String, int and boolean properties can be set. @@ -166,4 +177,54 @@ public void testResolvePropertyNoTemplate() { String result = PropertyHelper.resolveProperty(source, "camunda.test.someKey"); Assert.assertEquals("camunda.test.someKey", result); } + + @Test + public void shouldResolveKebabCaseProperties() { + // given + ProcessEngineConfigurationImpl engineConfiguration = new StandaloneProcessEngineConfiguration(); + JobExecutor jobExecutor = new DefaultJobExecutor(); + + Map configProperties = new HashMap<>(); + configProperties.put(KC_JDBC_URL_PROP, "someUrl"); + configProperties.put(KC_DB_IDENTITY_USED_PROP, "true"); + + Map executorProperties = new HashMap<>(); + executorProperties.put(KC_BACKOFF_TIME_IN_MILLIS, Integer.toString(Integer.MAX_VALUE)); + executorProperties.put(KC_WAIT_INCREASE_FACTOR, Float.toString(Float.MAX_VALUE)); + + // when + PropertyHelper.applyProperties(engineConfiguration, configProperties, PropertyHelper.KEBAB_CASE); + PropertyHelper.applyProperties(jobExecutor, executorProperties, PropertyHelper.KEBAB_CASE); + + // then + Assert.assertEquals(Integer.MAX_VALUE, jobExecutor.getBackoffTimeInMillis()); + Assert.assertEquals(Float.MAX_VALUE, jobExecutor.getWaitIncreaseFactor(), 0.0001d); + Assert.assertEquals(true, engineConfiguration.isDbIdentityUsed()); + Assert.assertEquals("someUrl", engineConfiguration.getJdbcUrl()); + } + + @Test + public void shouldResolveSnakeCaseProperties() { + // given + ProcessEngineConfigurationImpl engineConfiguration = new StandaloneProcessEngineConfiguration(); + JobExecutor jobExecutor = new DefaultJobExecutor(); + + Map configProperties = new HashMap<>(); + configProperties.put(SC_JDBC_URL_PROP, "someUrl"); + configProperties.put(SC_DB_IDENTITY_USED_PROP, "true"); + + Map executorProperties = new HashMap<>(); + executorProperties.put(SC_BACKOFF_TIME_IN_MILLIS, Integer.toString(Integer.MAX_VALUE)); + executorProperties.put(SC_WAIT_INCREASE_FACTOR, Float.toString(Float.MAX_VALUE)); + + // when + PropertyHelper.applyProperties(engineConfiguration, configProperties, PropertyHelper.SNAKE_CASE); + PropertyHelper.applyProperties(jobExecutor, executorProperties, PropertyHelper.SNAKE_CASE); + + // then + Assert.assertEquals(Integer.MAX_VALUE, jobExecutor.getBackoffTimeInMillis()); + Assert.assertEquals(Float.MAX_VALUE, jobExecutor.getWaitIncreaseFactor(), 0.0001d); + Assert.assertEquals(true, engineConfiguration.isDbIdentityUsed()); + Assert.assertEquals("someUrl", engineConfiguration.getJdbcUrl()); + } } diff --git a/quarkus-extension/engine/deployment/src/main/java/org/camunda/bpm/quarkus/engine/extension/deployment/impl/CamundaEngineProcessor.java b/quarkus-extension/engine/deployment/src/main/java/org/camunda/bpm/quarkus/engine/extension/deployment/impl/CamundaEngineProcessor.java index 76909bc413e..465c592067f 100644 --- a/quarkus-extension/engine/deployment/src/main/java/org/camunda/bpm/quarkus/engine/extension/deployment/impl/CamundaEngineProcessor.java +++ b/quarkus-extension/engine/deployment/src/main/java/org/camunda/bpm/quarkus/engine/extension/deployment/impl/CamundaEngineProcessor.java @@ -39,10 +39,10 @@ import org.camunda.bpm.engine.cdi.impl.context.RequestScopedAssociation; import org.camunda.bpm.engine.cdi.jsf.TaskForm; import org.camunda.bpm.engine.impl.cfg.ProcessEngineConfigurationImpl; -import org.camunda.bpm.quarkus.engine.extension.impl.CamundaEngineConfig; +import org.camunda.bpm.quarkus.engine.extension.CamundaEngineConfig; import org.camunda.bpm.quarkus.engine.extension.impl.CamundaEngineRecorder; import org.camunda.bpm.quarkus.engine.extension.impl.InjectableBusinessProcessContext; -import org.camunda.bpm.quarkus.engine.extension.impl.QuarkusProcessEngineConfiguration; +import org.camunda.bpm.quarkus.engine.extension.QuarkusProcessEngineConfiguration; import org.jboss.jandex.DotName; import javax.enterprise.context.Dependent; diff --git a/quarkus-extension/engine/deployment/src/test/java/org/camunda/bpm/quarkus/engine/test/CamundaEngineConfigTest.java b/quarkus-extension/engine/deployment/src/test/java/org/camunda/bpm/quarkus/engine/test/CamundaEngineConfigTest.java index f7044a1961c..46fed85b71a 100644 --- a/quarkus-extension/engine/deployment/src/test/java/org/camunda/bpm/quarkus/engine/test/CamundaEngineConfigTest.java +++ b/quarkus-extension/engine/deployment/src/test/java/org/camunda/bpm/quarkus/engine/test/CamundaEngineConfigTest.java @@ -21,7 +21,7 @@ import javax.inject.Inject; import io.quarkus.test.QuarkusUnitTest; -import org.camunda.bpm.quarkus.engine.extension.impl.CamundaEngineConfig; +import org.camunda.bpm.quarkus.engine.extension.CamundaEngineConfig; import org.camunda.bpm.quarkus.engine.test.helper.ProcessEngineAwareExtension; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.spec.JavaArchive; @@ -52,13 +52,13 @@ public void shouldLoadJobAcquisitionProperties() { // given a custom application.properties file // then - assertThat(config.jobExecutor.maxJobsPerAcquisition).isEqualTo(5); - assertThat(config.jobExecutor.lockTimeInMillis).isEqualTo(500000); - assertThat(config.jobExecutor.waitTimeInMillis).isEqualTo(7000); - assertThat(config.jobExecutor.maxWait).isEqualTo(65000); - assertThat(config.jobExecutor.backoffTimeInMillis).isEqualTo(5); - assertThat(config.jobExecutor.maxBackoff).isEqualTo(5); - assertThat(config.jobExecutor.backoffDecreaseThreshold).isEqualTo(120); - assertThat(config.jobExecutor.waitIncreaseFactor).isEqualTo(3); + assertThat(config.jobExecutor.genericConfig.get("max-jobs-per-acquisition")).isEqualTo("5"); + assertThat(config.jobExecutor.genericConfig.get("lock-time-in-millis")).isEqualTo("500000"); + assertThat(config.jobExecutor.genericConfig.get("wait-time-in-millis")).isEqualTo("7000"); + assertThat(config.jobExecutor.genericConfig.get("max-wait")).isEqualTo("65000"); + assertThat(config.jobExecutor.genericConfig.get("backoff-time-in-millis")).isEqualTo("5"); + assertThat(config.jobExecutor.genericConfig.get("max-backoff")).isEqualTo("5"); + assertThat(config.jobExecutor.genericConfig.get("backoff-decrease-threshold")).isEqualTo("120"); + assertThat(config.jobExecutor.genericConfig.get("wait-increase-factor")).isEqualTo("3"); } } diff --git a/quarkus-extension/engine/deployment/src/test/java/org/camunda/bpm/quarkus/engine/test/ConfigurableProcessEngineTest.java b/quarkus-extension/engine/deployment/src/test/java/org/camunda/bpm/quarkus/engine/test/ConfigurableProcessEngineTest.java index 86804c70fb6..273a8b95cb6 100644 --- a/quarkus-extension/engine/deployment/src/test/java/org/camunda/bpm/quarkus/engine/test/ConfigurableProcessEngineTest.java +++ b/quarkus-extension/engine/deployment/src/test/java/org/camunda/bpm/quarkus/engine/test/ConfigurableProcessEngineTest.java @@ -18,7 +18,7 @@ import io.quarkus.test.QuarkusUnitTest; import org.camunda.bpm.engine.ProcessEngine; -import org.camunda.bpm.quarkus.engine.extension.impl.QuarkusProcessEngineConfiguration; +import org.camunda.bpm.quarkus.engine.extension.QuarkusProcessEngineConfiguration; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.spec.JavaArchive; import org.junit.jupiter.api.Test; diff --git a/quarkus-extension/engine/deployment/src/test/java/org/camunda/bpm/quarkus/engine/test/ManagedJobExecutorTest.java b/quarkus-extension/engine/deployment/src/test/java/org/camunda/bpm/quarkus/engine/test/ManagedJobExecutorTest.java index c20f3280941..b43b36f818f 100644 --- a/quarkus-extension/engine/deployment/src/test/java/org/camunda/bpm/quarkus/engine/test/ManagedJobExecutorTest.java +++ b/quarkus-extension/engine/deployment/src/test/java/org/camunda/bpm/quarkus/engine/test/ManagedJobExecutorTest.java @@ -25,8 +25,8 @@ import org.camunda.bpm.engine.impl.test.TestHelper; import org.camunda.bpm.engine.runtime.ProcessInstance; import org.camunda.bpm.engine.test.Deployment; +import org.camunda.bpm.quarkus.engine.extension.QuarkusProcessEngineConfiguration; import org.camunda.bpm.quarkus.engine.extension.impl.ManagedJobExecutor; -import org.camunda.bpm.quarkus.engine.extension.impl.QuarkusProcessEngineConfiguration; import org.camunda.bpm.quarkus.engine.test.helper.ProcessEngineAwareExtension; import org.eclipse.microprofile.context.ManagedExecutor; import org.jboss.shrinkwrap.api.ShrinkWrap; diff --git a/quarkus-extension/engine/deployment/src/test/java/org/camunda/bpm/quarkus/engine/test/helper/ProcessEngineAwareExtension.java b/quarkus-extension/engine/deployment/src/test/java/org/camunda/bpm/quarkus/engine/test/helper/ProcessEngineAwareExtension.java index bcff37a871b..5a47a6f2932 100644 --- a/quarkus-extension/engine/deployment/src/test/java/org/camunda/bpm/quarkus/engine/test/helper/ProcessEngineAwareExtension.java +++ b/quarkus-extension/engine/deployment/src/test/java/org/camunda/bpm/quarkus/engine/test/helper/ProcessEngineAwareExtension.java @@ -21,7 +21,7 @@ import org.camunda.bpm.engine.ProcessEngine; import org.camunda.bpm.engine.impl.test.TestHelper; import org.camunda.bpm.engine.test.Deployment; -import org.camunda.bpm.quarkus.engine.extension.impl.QuarkusProcessEngineConfiguration; +import org.camunda.bpm.quarkus.engine.extension.QuarkusProcessEngineConfiguration; import org.jboss.shrinkwrap.api.spec.JavaArchive; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtensionContext; diff --git a/quarkus-extension/engine/deployment/src/test/java/org/camunda/bpm/quarkus/engine/test/id/ConfigureDbIdGeneratorTest.java b/quarkus-extension/engine/deployment/src/test/java/org/camunda/bpm/quarkus/engine/test/id/ConfigureDbIdGeneratorTest.java index 1ef1d5baa9b..fb8543b5fdc 100644 --- a/quarkus-extension/engine/deployment/src/test/java/org/camunda/bpm/quarkus/engine/test/id/ConfigureDbIdGeneratorTest.java +++ b/quarkus-extension/engine/deployment/src/test/java/org/camunda/bpm/quarkus/engine/test/id/ConfigureDbIdGeneratorTest.java @@ -22,7 +22,7 @@ import org.camunda.bpm.engine.impl.cfg.ProcessEngineConfigurationImpl; import org.camunda.bpm.engine.impl.db.DbIdGenerator; import org.camunda.bpm.engine.task.Task; -import org.camunda.bpm.quarkus.engine.extension.impl.QuarkusProcessEngineConfiguration; +import org.camunda.bpm.quarkus.engine.extension.QuarkusProcessEngineConfiguration; import org.camunda.bpm.quarkus.engine.test.helper.ProcessEngineAwareExtension; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.spec.JavaArchive; diff --git a/quarkus-extension/engine/deployment/src/test/java/org/camunda/bpm/quarkus/engine/test/persistence/conf/ChooseDatasourceConfigurationTest.java b/quarkus-extension/engine/deployment/src/test/java/org/camunda/bpm/quarkus/engine/test/persistence/conf/ChooseDatasourceConfigurationTest.java index ae44540c366..4fd05e5f23b 100644 --- a/quarkus-extension/engine/deployment/src/test/java/org/camunda/bpm/quarkus/engine/test/persistence/conf/ChooseDatasourceConfigurationTest.java +++ b/quarkus-extension/engine/deployment/src/test/java/org/camunda/bpm/quarkus/engine/test/persistence/conf/ChooseDatasourceConfigurationTest.java @@ -36,7 +36,7 @@ public class ChooseDatasourceConfigurationTest { @RegisterExtension static QuarkusUnitTest unitTest = new ProcessEngineAwareExtension() .withConfigurationResource("persistence/multiple-datasources-application.properties") - .overrideConfigKey("quarkus.camunda.bpm.datasource", "secondary") + .overrideConfigKey("quarkus.camunda.datasource", "secondary") .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class)); @Inject diff --git a/quarkus-extension/engine/deployment/src/test/java/org/camunda/bpm/quarkus/engine/test/persistence/conf/ChooseDefaultDatasourceConfigurationTest.java b/quarkus-extension/engine/deployment/src/test/java/org/camunda/bpm/quarkus/engine/test/persistence/conf/ChooseDefaultDatasourceConfigurationTest.java index 541f5223168..b55cdefe20d 100644 --- a/quarkus-extension/engine/deployment/src/test/java/org/camunda/bpm/quarkus/engine/test/persistence/conf/ChooseDefaultDatasourceConfigurationTest.java +++ b/quarkus-extension/engine/deployment/src/test/java/org/camunda/bpm/quarkus/engine/test/persistence/conf/ChooseDefaultDatasourceConfigurationTest.java @@ -35,7 +35,7 @@ public class ChooseDefaultDatasourceConfigurationTest { @RegisterExtension static QuarkusUnitTest unitTest = new ProcessEngineAwareExtension() .withConfigurationResource("persistence/multiple-datasources-application.properties") - .overrideConfigKey("quarkus.camunda.bpm.datasource", "") + .overrideConfigKey("quarkus.camunda.datasource", "") .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class)); @Inject diff --git a/quarkus-extension/engine/deployment/src/test/java/org/camunda/bpm/quarkus/engine/test/persistence/conf/ChooseNotExistingDatasourceConfigurationTest.java b/quarkus-extension/engine/deployment/src/test/java/org/camunda/bpm/quarkus/engine/test/persistence/conf/ChooseNotExistingDatasourceConfigurationTest.java index 7d576bea354..3f55f353388 100644 --- a/quarkus-extension/engine/deployment/src/test/java/org/camunda/bpm/quarkus/engine/test/persistence/conf/ChooseNotExistingDatasourceConfigurationTest.java +++ b/quarkus-extension/engine/deployment/src/test/java/org/camunda/bpm/quarkus/engine/test/persistence/conf/ChooseNotExistingDatasourceConfigurationTest.java @@ -30,7 +30,7 @@ public class ChooseNotExistingDatasourceConfigurationTest { @RegisterExtension static QuarkusUnitTest unitTest = new ProcessEngineAwareExtension() .withConfigurationResource("persistence/multiple-datasources-application.properties") - .overrideConfigKey("quarkus.camunda.bpm.datasource", "quaternary") + .overrideConfigKey("quarkus.camunda.datasource", "quaternary") .assertException(throwable -> assertThat(throwable) .hasMessage("No datasource named 'quaternary' exists") .isInstanceOf(IllegalArgumentException.class)) diff --git a/quarkus-extension/engine/deployment/src/test/resources/job-executor-application.properties b/quarkus-extension/engine/deployment/src/test/resources/job-executor-application.properties index 5d36ebd8b9d..c20f0919a37 100644 --- a/quarkus-extension/engine/deployment/src/test/resources/job-executor-application.properties +++ b/quarkus-extension/engine/deployment/src/test/resources/job-executor-application.properties @@ -1,13 +1,13 @@ -quarkus.camunda.bpm.job-executor.thread-pool.max-pool-size=12 -quarkus.camunda.bpm.job-executor.thread-pool.queue-size=5 +quarkus.camunda.job-executor.thread-pool.max-pool-size=12 +quarkus.camunda.job-executor.thread-pool.queue-size=5 -quarkus.camunda.bpm.job-executor.max-jobs-per-acquisition=5 -quarkus.camunda.bpm.job-executor.lock-time-in-millis=500000 -quarkus.camunda.bpm.job-executor.wait-time-in-millis=7000 -quarkus.camunda.bpm.job-executor.max-wait=65000 -quarkus.camunda.bpm.job-executor.backoff-time-in-millis=5 -quarkus.camunda.bpm.job-executor.max-backoff=5 -quarkus.camunda.bpm.job-executor.backoff-decrease-threshold=120 -quarkus.camunda.bpm.job-executor.wait-increase-factor=3 +quarkus.camunda.job-executor.max-jobs-per-acquisition=5 +quarkus.camunda.job-executor.lock-time-in-millis=500000 +quarkus.camunda.job-executor.wait-time-in-millis=7000 +quarkus.camunda.job-executor.max-wait=65000 +quarkus.camunda.job-executor.backoff-time-in-millis=5 +quarkus.camunda.job-executor.max-backoff=5 +quarkus.camunda.job-executor.backoff-decrease-threshold=120 +quarkus.camunda.job-executor.wait-increase-factor=3 quarkus.datasource.jdbc.url=jdbc:h2:mem:camunda;MVCC=TRUE;TRACE_LEVEL_FILE=0;DB_CLOSE_ON_EXIT=FALSE \ No newline at end of file diff --git a/quarkus-extension/engine/qa/src/test/java/org/camunda/bpm/engine/cdi/test/CdiProcessEngineTestCase.java b/quarkus-extension/engine/qa/src/test/java/org/camunda/bpm/engine/cdi/test/CdiProcessEngineTestCase.java index f1cbfa0fe0f..0dda7a31b97 100644 --- a/quarkus-extension/engine/qa/src/test/java/org/camunda/bpm/engine/cdi/test/CdiProcessEngineTestCase.java +++ b/quarkus-extension/engine/qa/src/test/java/org/camunda/bpm/engine/cdi/test/CdiProcessEngineTestCase.java @@ -35,7 +35,7 @@ import org.camunda.bpm.engine.TaskService; import org.camunda.bpm.engine.impl.cfg.ProcessEngineConfigurationImpl; import org.camunda.bpm.engine.impl.test.TestHelper; -import org.camunda.bpm.quarkus.engine.extension.impl.QuarkusProcessEngineConfiguration; +import org.camunda.bpm.quarkus.engine.extension.QuarkusProcessEngineConfiguration; import org.junit.After; import org.junit.Before; diff --git a/quarkus-extension/engine/runtime/src/main/java/org/camunda/bpm/quarkus/engine/extension/impl/CamundaEngineConfig.java b/quarkus-extension/engine/runtime/src/main/java/org/camunda/bpm/quarkus/engine/extension/CamundaEngineConfig.java similarity index 92% rename from quarkus-extension/engine/runtime/src/main/java/org/camunda/bpm/quarkus/engine/extension/impl/CamundaEngineConfig.java rename to quarkus-extension/engine/runtime/src/main/java/org/camunda/bpm/quarkus/engine/extension/CamundaEngineConfig.java index 70703fec151..933c7820150 100644 --- a/quarkus-extension/engine/runtime/src/main/java/org/camunda/bpm/quarkus/engine/extension/impl/CamundaEngineConfig.java +++ b/quarkus-extension/engine/runtime/src/main/java/org/camunda/bpm/quarkus/engine/extension/CamundaEngineConfig.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.camunda.bpm.quarkus.engine.extension.impl; +package org.camunda.bpm.quarkus.engine.extension; import io.quarkus.runtime.annotations.ConfigItem; import io.quarkus.runtime.annotations.ConfigPhase; @@ -22,7 +22,7 @@ import java.util.Optional; -@ConfigRoot(phase = ConfigPhase.RUN_TIME, name = "camunda.bpm") +@ConfigRoot(phase = ConfigPhase.RUN_TIME, name = "camunda") public class CamundaEngineConfig { /** diff --git a/quarkus-extension/engine/runtime/src/main/java/org/camunda/bpm/quarkus/engine/extension/CamundaJobExecutorConfig.java b/quarkus-extension/engine/runtime/src/main/java/org/camunda/bpm/quarkus/engine/extension/CamundaJobExecutorConfig.java new file mode 100644 index 00000000000..13bf8ac0789 --- /dev/null +++ b/quarkus-extension/engine/runtime/src/main/java/org/camunda/bpm/quarkus/engine/extension/CamundaJobExecutorConfig.java @@ -0,0 +1,57 @@ +/* + * Copyright Camunda Services GmbH and/or licensed to Camunda Services GmbH + * under one or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information regarding copyright + * ownership. Camunda licenses this file to you under the Apache License, + * Version 2.0; you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.camunda.bpm.quarkus.engine.extension; + +import java.util.Map; + +import io.quarkus.runtime.annotations.ConfigGroup; +import io.quarkus.runtime.annotations.ConfigItem; + +@ConfigGroup +public class CamundaJobExecutorConfig { + + /** + * The Camunda JobExecutor configuration properties. For more details, see + * {@link https://docs.camunda.org/manual/latest/reference/deployment-descriptors/tags/job-executor/#job-acquisition-configuration-properties} + */ + @ConfigItem(name = ConfigItem.PARENT) + public Map genericConfig; + + /** + * The Camunda JobExecutor thread pool config. This thread pool is responsible for running + * Camunda jobs. + */ + @ConfigItem + public ThreadPoolConfig threadPool; + + @ConfigGroup + public static class ThreadPoolConfig { + /** + * Sets the maximum number of threads that can be present in the Quarkus-managed + * thread pool for the Camunda JobExecutor. The default value is 10. + */ + @ConfigItem(defaultValue = "10") + public int maxPoolSize; + + /** + * Sets the size of the Quarkus-managed JobExecutor queue. The default value is 3. + */ + @ConfigItem(defaultValue = "3") + public int queueSize; + + } +} \ No newline at end of file diff --git a/quarkus-extension/engine/runtime/src/main/java/org/camunda/bpm/quarkus/engine/extension/impl/QuarkusProcessEngineConfiguration.java b/quarkus-extension/engine/runtime/src/main/java/org/camunda/bpm/quarkus/engine/extension/QuarkusProcessEngineConfiguration.java similarity index 98% rename from quarkus-extension/engine/runtime/src/main/java/org/camunda/bpm/quarkus/engine/extension/impl/QuarkusProcessEngineConfiguration.java rename to quarkus-extension/engine/runtime/src/main/java/org/camunda/bpm/quarkus/engine/extension/QuarkusProcessEngineConfiguration.java index 3867fb4dc96..adc858d83d6 100644 --- a/quarkus-extension/engine/runtime/src/main/java/org/camunda/bpm/quarkus/engine/extension/impl/QuarkusProcessEngineConfiguration.java +++ b/quarkus-extension/engine/runtime/src/main/java/org/camunda/bpm/quarkus/engine/extension/QuarkusProcessEngineConfiguration.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.camunda.bpm.quarkus.engine.extension.impl; +package org.camunda.bpm.quarkus.engine.extension; import org.camunda.bpm.engine.cdi.CdiJtaProcessEngineConfiguration; import org.camunda.bpm.engine.impl.interceptor.CommandContextInterceptor; diff --git a/quarkus-extension/engine/runtime/src/main/java/org/camunda/bpm/quarkus/engine/extension/impl/CamundaEngineRecorder.java b/quarkus-extension/engine/runtime/src/main/java/org/camunda/bpm/quarkus/engine/extension/impl/CamundaEngineRecorder.java index f377a61786a..1894c315997 100644 --- a/quarkus-extension/engine/runtime/src/main/java/org/camunda/bpm/quarkus/engine/extension/impl/CamundaEngineRecorder.java +++ b/quarkus-extension/engine/runtime/src/main/java/org/camunda/bpm/quarkus/engine/extension/impl/CamundaEngineRecorder.java @@ -21,13 +21,17 @@ import io.quarkus.runtime.RuntimeValue; import io.quarkus.runtime.ShutdownContext; import io.quarkus.runtime.annotations.Recorder; +import io.smallrye.context.SmallRyeManagedExecutor; import org.camunda.bpm.container.RuntimeContainerDelegate; +import org.camunda.bpm.container.impl.metadata.PropertyHelper; import org.camunda.bpm.engine.ProcessEngine; import org.camunda.bpm.engine.cdi.impl.event.CdiEventSupportBpmnParseListener; import org.camunda.bpm.engine.cdi.impl.util.BeanManagerLookup; import org.camunda.bpm.engine.impl.bpmn.parser.BpmnParseListener; import org.camunda.bpm.engine.impl.cfg.ProcessEngineConfigurationImpl; import org.camunda.bpm.engine.impl.jobexecutor.JobExecutor; +import org.camunda.bpm.quarkus.engine.extension.CamundaEngineConfig; +import org.camunda.bpm.quarkus.engine.extension.QuarkusProcessEngineConfiguration; import org.eclipse.microprofile.context.ManagedExecutor; import javax.enterprise.inject.spi.BeanManager; @@ -63,19 +67,7 @@ public RuntimeValue createProcessEngineConfigura // configure job executor, // if not already configured by a custom configuration if (configuration.getJobExecutor() == null) { - - int maxPoolSize = config.jobExecutor.threadPool.maxPoolSize; - int queueSize = config.jobExecutor.threadPool.queueSize; - - // create a non-bean ManagedExecutor instance. This instance - // delegates tasks to the Quarkus core Executor/thread pool. - ManagedExecutor managedExecutor = ManagedExecutor.builder() - .maxQueued(queueSize) - .maxAsync(maxPoolSize) - .build(); - - ManagedJobExecutor quarkusJobExecutor = new ManagedJobExecutor(managedExecutor, config); - configuration.setJobExecutor(quarkusJobExecutor); + configureJobExecutor(configuration, config); } configureCdiEventBridge(configuration); @@ -130,4 +122,25 @@ public void registerShutdownTask(ShutdownContext shutdownContext, }); } + protected void configureJobExecutor(ProcessEngineConfigurationImpl configuration, + CamundaEngineConfig config) { + + int maxPoolSize = config.jobExecutor.threadPool.maxPoolSize; + int queueSize = config.jobExecutor.threadPool.queueSize; + + // create a non-bean ManagedExecutor instance. This instance + // uses it's own Executor/thread pool. + ManagedExecutor managedExecutor = SmallRyeManagedExecutor.builder() + .maxQueued(queueSize) + .maxAsync(maxPoolSize) + .withNewExecutorService() + .build(); + ManagedJobExecutor quarkusJobExecutor = new ManagedJobExecutor(managedExecutor); + + // apply job executor configuration properties + PropertyHelper + .applyProperties(quarkusJobExecutor, config.jobExecutor.genericConfig, PropertyHelper.KEBAB_CASE); + + configuration.setJobExecutor(quarkusJobExecutor); + } } diff --git a/quarkus-extension/engine/runtime/src/main/java/org/camunda/bpm/quarkus/engine/extension/impl/CamundaJobExecutorConfig.java b/quarkus-extension/engine/runtime/src/main/java/org/camunda/bpm/quarkus/engine/extension/impl/CamundaJobExecutorConfig.java deleted file mode 100644 index 89ca815c01d..00000000000 --- a/quarkus-extension/engine/runtime/src/main/java/org/camunda/bpm/quarkus/engine/extension/impl/CamundaJobExecutorConfig.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright Camunda Services GmbH and/or licensed to Camunda Services GmbH - * under one or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information regarding copyright - * ownership. Camunda licenses this file to you under the Apache License, - * Version 2.0; you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.camunda.bpm.quarkus.engine.extension.impl; - -import io.quarkus.runtime.annotations.ConfigGroup; -import io.quarkus.runtime.annotations.ConfigItem; - -@ConfigGroup -public class CamundaJobExecutorConfig { - - /** - * Sets the maximal number of jobs to be acquired at once. The default value is 3. - */ - @ConfigItem(defaultValue = "3") - public int maxJobsPerAcquisition; - - /** - * Specifies the time in milliseconds an acquired job is locked for execution. During that time, - * no other job executor can acquire the job. The default value is 300000. - */ - @ConfigItem(defaultValue = "300000") - public int lockTimeInMillis; - - /** - * Specifies the wait time of the job acquisition thread in milliseconds in case there are less - * jobs available for execution than requested during acquisition. If this is repeatedly the - * case, the wait time is increased exponentially by the factor waitIncreaseFactor. - * The wait time is capped by maxWait. The default value is 5000. - */ - @ConfigItem(defaultValue = "5000") - public int waitTimeInMillis; - - /** - * Specifies the maximum wait time of the job acquisition thread in milliseconds in case there - * are less jobs available for execution than requested during acquisition. The default value - * is 60000. - */ - @ConfigItem(defaultValue = "60000") - public long maxWait; - - /** - * Specifies the wait time of the job acquisition thread in milliseconds in case jobs were - * acquired but could not be locked. This condition indicates that there are other job - * acquisition threads acquiring jobs in parallel. If this is repeatedly the case, the backoff - * time is increased exponentially by the factor waitIncreaseFactor. The time is capped by - * maxBackoff. With every increase in backoff time, the number of jobs acquired - * increases by waitIncreaseFactor as well. The default value is 0. - */ - @ConfigItem(defaultValue = "0") - public int backoffTimeInMillis; - - /** - * Specifies the maximum wait time of the job acquisition thread in milliseconds in case jobs - * were acquired but could not be locked. The default value is 0. - */ - @ConfigItem(defaultValue = "0") - public long maxBackoff; - - /** - * Specifies the number of successful job acquisition cycles without a job locking failure - * before the backoff time is decreased again. In that case, the backoff time is reduced by - * waitIncreaseFactor. The default value is 100. - */ - @ConfigItem(defaultValue = "100") - public int backoffDecreaseThreshold; - - /** - * Specifies the factor by which wait and backoff time are increased in case their activation - * conditions are repeatedly met. The default value is 2. - */ - @ConfigItem(defaultValue = "2") - public float waitIncreaseFactor; - - /** - * The Camunda JobExecutor thread pool config. This thread pool is responsible for running - * Camunda jobs. - */ - @ConfigItem - public ThreadPoolConfig threadPool; - - @ConfigGroup - public static class ThreadPoolConfig { - /** - * Sets the maximum number of threads that can be present in the Quarkus-managed - * thread pool for the Camunda JobExecutor. The default value is 10. - */ - @ConfigItem(defaultValue = "10") - public int maxPoolSize; - - /** - * Sets the size of the Quarkus-managed JobExecutor queue. The default value is 3. - */ - @ConfigItem(defaultValue = "3") - public int queueSize; - - } -} \ No newline at end of file diff --git a/quarkus-extension/engine/runtime/src/main/java/org/camunda/bpm/quarkus/engine/extension/impl/ManagedJobExecutor.java b/quarkus-extension/engine/runtime/src/main/java/org/camunda/bpm/quarkus/engine/extension/impl/ManagedJobExecutor.java index 7e75f710f44..af23d8a28fa 100644 --- a/quarkus-extension/engine/runtime/src/main/java/org/camunda/bpm/quarkus/engine/extension/impl/ManagedJobExecutor.java +++ b/quarkus-extension/engine/runtime/src/main/java/org/camunda/bpm/quarkus/engine/extension/impl/ManagedJobExecutor.java @@ -25,30 +25,13 @@ import org.eclipse.microprofile.context.ManagedExecutor; /** - * A {@link JobExecutor} implementation that utilises the Quarkus - * container-managed thread pool to acquire and execute jobs. + * A {@link JobExecutor} implementation that utilises a separate thread pool + * to acquire and execute jobs. */ public class ManagedJobExecutor extends JobExecutor { protected ManagedExecutor taskExecutor; - /** - * Constructs a new QuarkusJobExecutor with the provided - * {@link ManagedExecutor} instance and a {@link CamundaEngineConfig} instance. - */ - public ManagedJobExecutor(ManagedExecutor taskExecutor, CamundaEngineConfig config) { - this(taskExecutor); - // set Job Acquisition properties - this.maxJobsPerAcquisition = config.jobExecutor.maxJobsPerAcquisition; - this.lockTimeInMillis = config.jobExecutor.lockTimeInMillis; - this.waitTimeInMillis = config.jobExecutor.waitTimeInMillis; - this.maxWait = config.jobExecutor.maxWait; - this.backoffTimeInMillis = config.jobExecutor.backoffTimeInMillis; - this.maxBackoff = config.jobExecutor.maxBackoff; - this.backoffDecreaseThreshold = config.jobExecutor.backoffDecreaseThreshold; - this.waitIncreaseFactor = config.jobExecutor.waitIncreaseFactor; - } - /** * Constructs a new QuarkusJobExecutor with the provided * {@link ManagedExecutor} instance.