From f85934ea9ecb8d2b9e9ba974e8c31b9a464f7985 Mon Sep 17 00:00:00 2001 From: Jacob Middag Date: Fri, 21 Jun 2019 22:53:02 +0200 Subject: [PATCH 1/6] Add an ActiveMQ Artemis extension --- bom/deployment/pom.xml | 20 +++ bom/runtime/pom.xml | 23 +++- build-parent/pom.xml | 1 + .../builditem/FeatureBuildItem.java | 2 + .../common/src/main/filtered/extensions.json | 18 +++ extensions/artemis-core/deployment/pom.xml | 54 ++++++++ .../core/deployment/ArtemisCoreProcessor.java | 101 ++++++++++++++ extensions/artemis-core/pom.xml | 21 +++ extensions/artemis-core/runtime/pom.xml | 64 +++++++++ .../core/runtime/ArtemisBuildConfig.java | 35 +++++ .../core/runtime/ArtemisCoreProducer.java | 26 ++++ .../core/runtime/ArtemisCoreTemplate.java | 12 ++ .../core/runtime/ArtemisRuntimeConfig.java | 29 ++++ .../graal/CheckDependenciesSubstitutions.java | 20 +++ extensions/artemis-jms/deployment/pom.xml | 44 ++++++ .../jms/deployment/ArtemisJmsProcessor.java | 38 ++++++ extensions/artemis-jms/pom.xml | 21 +++ extensions/artemis-jms/runtime/pom.xml | 49 +++++++ .../jms/runtime/ArtemisJmsProducer.java | 28 ++++ .../jms/runtime/ArtemisJmsTemplate.java | 13 ++ .../deployment/InfinispanClientProcessor.java | 5 + .../netty/deployment/NettyProcessor.java | 34 +++++ extensions/pom.xml | 2 + integration-tests/artemis-core/pom.xml | 128 ++++++++++++++++++ .../it/artemis/ArtemisConsumerManager.java | 36 +++++ .../quarkus/it/artemis/ArtemisEndpoint.java | 26 ++++ .../it/artemis/ArtemisProducerManager.java | 35 +++++ .../src/main/resources/application.properties | 1 + .../it/artemis/ArtemisConsumerITCase.java | 8 ++ .../it/artemis/ArtemisConsumerTest.java | 31 +++++ .../io/quarkus/it/artemis/ArtemisHelper.java | 17 +++ .../it/artemis/ArtemisProducerITCase.java | 8 ++ .../it/artemis/ArtemisProducerTest.java | 31 +++++ .../it/artemis/ArtemisTestResource.java | 36 +++++ .../src/test/resources/broker.xml | 25 ++++ integration-tests/artemis-jms/pom.xml | 128 ++++++++++++++++++ .../it/artemis/ArtemisConsumerManager.java | 35 +++++ .../quarkus/it/artemis/ArtemisEndpoint.java | 26 ++++ .../it/artemis/ArtemisProducerManager.java | 34 +++++ .../src/main/resources/application.properties | 1 + .../it/artemis/ArtemisConsumerITCase.java | 8 ++ .../it/artemis/ArtemisConsumerTest.java | 29 ++++ .../io/quarkus/it/artemis/ArtemisHelper.java | 22 +++ .../it/artemis/ArtemisProducerITCase.java | 8 ++ .../it/artemis/ArtemisProducerTest.java | 32 +++++ .../it/artemis/ArtemisTestResource.java | 36 +++++ .../artemis-jms/src/test/resources/broker.xml | 23 ++++ integration-tests/pom.xml | 2 + 48 files changed, 1425 insertions(+), 1 deletion(-) create mode 100644 extensions/artemis-core/deployment/pom.xml create mode 100644 extensions/artemis-core/deployment/src/main/java/io/quarkus/artemis/core/deployment/ArtemisCoreProcessor.java create mode 100644 extensions/artemis-core/pom.xml create mode 100644 extensions/artemis-core/runtime/pom.xml create mode 100644 extensions/artemis-core/runtime/src/main/java/io/quarkus/artemis/core/runtime/ArtemisBuildConfig.java create mode 100644 extensions/artemis-core/runtime/src/main/java/io/quarkus/artemis/core/runtime/ArtemisCoreProducer.java create mode 100644 extensions/artemis-core/runtime/src/main/java/io/quarkus/artemis/core/runtime/ArtemisCoreTemplate.java create mode 100644 extensions/artemis-core/runtime/src/main/java/io/quarkus/artemis/core/runtime/ArtemisRuntimeConfig.java create mode 100644 extensions/artemis-core/runtime/src/main/java/io/quarkus/artemis/core/runtime/graal/CheckDependenciesSubstitutions.java create mode 100644 extensions/artemis-jms/deployment/pom.xml create mode 100644 extensions/artemis-jms/deployment/src/main/java/io/quarkus/artemis/jms/deployment/ArtemisJmsProcessor.java create mode 100644 extensions/artemis-jms/pom.xml create mode 100644 extensions/artemis-jms/runtime/pom.xml create mode 100644 extensions/artemis-jms/runtime/src/main/java/io/quarkus/artemis/jms/runtime/ArtemisJmsProducer.java create mode 100644 extensions/artemis-jms/runtime/src/main/java/io/quarkus/artemis/jms/runtime/ArtemisJmsTemplate.java create mode 100644 integration-tests/artemis-core/pom.xml create mode 100644 integration-tests/artemis-core/src/main/java/io/quarkus/it/artemis/ArtemisConsumerManager.java create mode 100644 integration-tests/artemis-core/src/main/java/io/quarkus/it/artemis/ArtemisEndpoint.java create mode 100644 integration-tests/artemis-core/src/main/java/io/quarkus/it/artemis/ArtemisProducerManager.java create mode 100644 integration-tests/artemis-core/src/main/resources/application.properties create mode 100644 integration-tests/artemis-core/src/test/java/io/quarkus/it/artemis/ArtemisConsumerITCase.java create mode 100644 integration-tests/artemis-core/src/test/java/io/quarkus/it/artemis/ArtemisConsumerTest.java create mode 100644 integration-tests/artemis-core/src/test/java/io/quarkus/it/artemis/ArtemisHelper.java create mode 100644 integration-tests/artemis-core/src/test/java/io/quarkus/it/artemis/ArtemisProducerITCase.java create mode 100644 integration-tests/artemis-core/src/test/java/io/quarkus/it/artemis/ArtemisProducerTest.java create mode 100644 integration-tests/artemis-core/src/test/java/io/quarkus/it/artemis/ArtemisTestResource.java create mode 100644 integration-tests/artemis-core/src/test/resources/broker.xml create mode 100644 integration-tests/artemis-jms/pom.xml create mode 100644 integration-tests/artemis-jms/src/main/java/io/quarkus/it/artemis/ArtemisConsumerManager.java create mode 100644 integration-tests/artemis-jms/src/main/java/io/quarkus/it/artemis/ArtemisEndpoint.java create mode 100644 integration-tests/artemis-jms/src/main/java/io/quarkus/it/artemis/ArtemisProducerManager.java create mode 100644 integration-tests/artemis-jms/src/main/resources/application.properties create mode 100644 integration-tests/artemis-jms/src/test/java/io/quarkus/it/artemis/ArtemisConsumerITCase.java create mode 100644 integration-tests/artemis-jms/src/test/java/io/quarkus/it/artemis/ArtemisConsumerTest.java create mode 100644 integration-tests/artemis-jms/src/test/java/io/quarkus/it/artemis/ArtemisHelper.java create mode 100644 integration-tests/artemis-jms/src/test/java/io/quarkus/it/artemis/ArtemisProducerITCase.java create mode 100644 integration-tests/artemis-jms/src/test/java/io/quarkus/it/artemis/ArtemisProducerTest.java create mode 100644 integration-tests/artemis-jms/src/test/java/io/quarkus/it/artemis/ArtemisTestResource.java create mode 100644 integration-tests/artemis-jms/src/test/resources/broker.xml diff --git a/bom/deployment/pom.xml b/bom/deployment/pom.xml index 16bcb6e2224d8..a44b0b50c8f20 100644 --- a/bom/deployment/pom.xml +++ b/bom/deployment/pom.xml @@ -96,6 +96,26 @@ quarkus-agroal-deployment ${project.version} + + io.quarkus + quarkus-artemis-core + ${project.version} + + + io.quarkus + quarkus-artemis-core-deployment + ${project.version} + + + io.quarkus + quarkus-artemis-jms + ${project.version} + + + io.quarkus + quarkus-artemis-jms-deployment + ${project.version} + io.quarkus quarkus-hibernate-validator-deployment diff --git a/bom/runtime/pom.xml b/bom/runtime/pom.xml index a3669539b0de3..32798c6707109 100644 --- a/bom/runtime/pom.xml +++ b/bom/runtime/pom.xml @@ -150,6 +150,7 @@ 2.0.0-alpha03 3.10.2 1.11.0 + 2.9.0 3.1.0 6.0.1 @@ -277,6 +278,16 @@ quarkus-agroal ${project.version} + + io.quarkus + quarkus-artemis-core + ${project.version} + + + io.quarkus + quarkus-artemis-jms + ${project.version} + io.quarkus quarkus-elasticsearch-rest-client @@ -1069,6 +1080,16 @@ log4j ${log4j.version} + + org.apache.activemq + artemis-core-client + ${artemis.version} + + + org.apache.activemq + artemis-jms-client + ${artemis.version} + org.apache.httpcomponents httpclient @@ -2077,7 +2098,7 @@ jetty-webapp ${jetty.version} - + diff --git a/build-parent/pom.xml b/build-parent/pom.xml index 8507feed43486..411b45acaac48 100644 --- a/build-parent/pom.xml +++ b/build-parent/pom.xml @@ -31,6 +31,7 @@ 3.3.0 0.0.7 3.7.1 + 2.9.0 2.3.28 diff --git a/core/deployment/src/main/java/io/quarkus/deployment/builditem/FeatureBuildItem.java b/core/deployment/src/main/java/io/quarkus/deployment/builditem/FeatureBuildItem.java index 0c02f01f16cc4..896836b8a50e7 100644 --- a/core/deployment/src/main/java/io/quarkus/deployment/builditem/FeatureBuildItem.java +++ b/core/deployment/src/main/java/io/quarkus/deployment/builditem/FeatureBuildItem.java @@ -10,6 +10,8 @@ public final class FeatureBuildItem extends MultiBuildItem { public static final String AGROAL = "agroal"; + public static final String ARTEMIS_CORE = "artemis-core"; + public static final String ARTEMIS_JMS = "artemis-jms"; public static final String CDI = "cdi"; public static final String DYNAMODB = "dynamodb"; public static final String ELASTICSEARCH_REST_CLIENT = "elasticsearch-rest-client"; diff --git a/devtools/common/src/main/filtered/extensions.json b/devtools/common/src/main/filtered/extensions.json index 54f6769944232..707462898cc47 100644 --- a/devtools/common/src/main/filtered/extensions.json +++ b/devtools/common/src/main/filtered/extensions.json @@ -68,6 +68,24 @@ "groupId": "io.quarkus", "artifactId": "quarkus-amazon-lambda" }, + { + "name": "Artemis Core", + "labels": [ + "artemis-core", + "artemis" + ], + "groupId": "io.quarkus", + "artifactId": "quarkus-artemis-core" + }, + { + "name": "Artemis JMS", + "labels": [ + "artemis-jms", + "artemis" + ], + "groupId": "io.quarkus", + "artifactId": "quarkus-artemis-jms" + }, { "name": "Flyway", "labels": [ diff --git a/extensions/artemis-core/deployment/pom.xml b/extensions/artemis-core/deployment/pom.xml new file mode 100644 index 0000000000000..b5212a74ca088 --- /dev/null +++ b/extensions/artemis-core/deployment/pom.xml @@ -0,0 +1,54 @@ + + + + io.quarkus + quarkus-artemis-core-parent + 999-SNAPSHOT + + 4.0.0 + + quarkus-artemis-core-deployment + Quarkus - Artemis - Core - Deployment + + + + io.quarkus + quarkus-core-deployment + + + + io.quarkus + quarkus-arc-deployment + + + + io.quarkus + quarkus-netty-deployment + + + + io.quarkus + quarkus-artemis-core + + + + + + + maven-compiler-plugin + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + + + + diff --git a/extensions/artemis-core/deployment/src/main/java/io/quarkus/artemis/core/deployment/ArtemisCoreProcessor.java b/extensions/artemis-core/deployment/src/main/java/io/quarkus/artemis/core/deployment/ArtemisCoreProcessor.java new file mode 100644 index 0000000000000..46b9fb8aea57d --- /dev/null +++ b/extensions/artemis-core/deployment/src/main/java/io/quarkus/artemis/core/deployment/ArtemisCoreProcessor.java @@ -0,0 +1,101 @@ +package io.quarkus.artemis.core.deployment; + +import java.util.Collection; + +import org.apache.activemq.artemis.api.core.client.loadbalance.ConnectionLoadBalancingPolicy; +import org.apache.activemq.artemis.api.core.client.loadbalance.FirstElementConnectionLoadBalancingPolicy; +import org.apache.activemq.artemis.api.core.client.loadbalance.RandomConnectionLoadBalancingPolicy; +import org.apache.activemq.artemis.api.core.client.loadbalance.RandomStickyConnectionLoadBalancingPolicy; +import org.apache.activemq.artemis.api.core.client.loadbalance.RoundRobinConnectionLoadBalancingPolicy; +import org.apache.activemq.artemis.core.remoting.impl.netty.NettyConnectorFactory; +import org.apache.activemq.artemis.spi.core.remoting.ConnectorFactory; +import org.apache.commons.logging.impl.Jdk14Logger; +import org.apache.commons.logging.impl.LogFactoryImpl; +import org.jboss.jandex.ClassInfo; +import org.jboss.jandex.DotName; +import org.jboss.logging.Logger; + +import io.quarkus.arc.deployment.AdditionalBeanBuildItem; +import io.quarkus.arc.deployment.BeanContainerBuildItem; +import io.quarkus.artemis.core.runtime.ArtemisBuildConfig; +import io.quarkus.artemis.core.runtime.ArtemisCoreProducer; +import io.quarkus.artemis.core.runtime.ArtemisCoreTemplate; +import io.quarkus.artemis.core.runtime.ArtemisRuntimeConfig; +import io.quarkus.deployment.annotations.BuildProducer; +import io.quarkus.deployment.annotations.BuildStep; +import io.quarkus.deployment.annotations.ExecutionTime; +import io.quarkus.deployment.annotations.Record; +import io.quarkus.deployment.builditem.CombinedIndexBuildItem; +import io.quarkus.deployment.builditem.FeatureBuildItem; +import io.quarkus.deployment.builditem.substrate.ReflectiveClassBuildItem; + +public class ArtemisCoreProcessor { + + private static final Logger LOGGER = Logger.getLogger(ArtemisCoreProcessor.class); + + static final Class[] BUILTIN_CONNECTOR_FACTORIES = { + NettyConnectorFactory.class + }; + + static final Class[] BUILTIN_LOADBALANCING_POLICIES = { + FirstElementConnectionLoadBalancingPolicy.class, + RandomConnectionLoadBalancingPolicy.class, + RandomStickyConnectionLoadBalancingPolicy.class, + RoundRobinConnectionLoadBalancingPolicy.class + }; + + @BuildStep + void build(CombinedIndexBuildItem indexBuildItem, + BuildProducer reflectiveClass) { + + reflectiveClass.produce(new ReflectiveClassBuildItem(false, false, + LogFactoryImpl.class.getName(), Jdk14Logger.class.getName())); + + Collection connectorFactories = indexBuildItem.getIndex() + .getAllKnownImplementors(DotName.createSimple(ConnectorFactory.class.getName())); + + for (ClassInfo ci : connectorFactories) { + LOGGER.debug("Adding reflective class " + ci); + reflectiveClass.produce(new ReflectiveClassBuildItem(false, false, ci.toString())); + } + + for (Class c : BUILTIN_CONNECTOR_FACTORIES) { + reflectiveClass.produce(new ReflectiveClassBuildItem(false, false, c)); + } + + Collection loadBalancers = indexBuildItem.getIndex() + .getAllKnownImplementors(DotName.createSimple(ConnectionLoadBalancingPolicy.class.getName())); + + for (ClassInfo ci : loadBalancers) { + LOGGER.debug("Adding reflective class " + ci); + reflectiveClass.produce(new ReflectiveClassBuildItem(false, false, ci.toString())); + } + + for (Class c : BUILTIN_LOADBALANCING_POLICIES) { + reflectiveClass.produce(new ReflectiveClassBuildItem(false, false, c)); + } + + } + + @BuildStep + @Record(ExecutionTime.STATIC_INIT) + void load(ArtemisBuildConfig config, BuildProducer additionalBean, + BuildProducer feature) { + + if (config.getProtocol() != ArtemisBuildConfig.Protocol.CORE) { + return; + } + feature.produce(new FeatureBuildItem(FeatureBuildItem.ARTEMIS_CORE)); + additionalBean.produce(AdditionalBeanBuildItem.unremovableOf(ArtemisCoreProducer.class)); + } + + @Record(ExecutionTime.RUNTIME_INIT) + @BuildStep + void configure(ArtemisBuildConfig buildConfig, ArtemisCoreTemplate template, ArtemisRuntimeConfig runtimeConfig, + BeanContainerBuildItem beanContainer) { + + if (buildConfig.getProtocol() == ArtemisBuildConfig.Protocol.CORE) { + template.setConfig(runtimeConfig, beanContainer.getValue()); + } + } +} diff --git a/extensions/artemis-core/pom.xml b/extensions/artemis-core/pom.xml new file mode 100644 index 0000000000000..6136f616664b2 --- /dev/null +++ b/extensions/artemis-core/pom.xml @@ -0,0 +1,21 @@ + + + + quarkus-build-parent + io.quarkus + 999-SNAPSHOT + ../../build-parent/pom.xml + + + 4.0.0 + quarkus-artemis-core-parent + Quarkus - Artemis - Core + pom + + + deployment + runtime + + diff --git a/extensions/artemis-core/runtime/pom.xml b/extensions/artemis-core/runtime/pom.xml new file mode 100644 index 0000000000000..cdf0130ac4ac4 --- /dev/null +++ b/extensions/artemis-core/runtime/pom.xml @@ -0,0 +1,64 @@ + + + + io.quarkus + quarkus-artemis-core-parent + 999-SNAPSHOT + + 4.0.0 + + quarkus-artemis-core + Quarkus - Artemis - Core - Runtime + + + + io.quarkus + quarkus-core + + + + io.quarkus + quarkus-arc + + + + io.quarkus + quarkus-netty + + + + org.apache.activemq + artemis-core-client + + + + com.oracle.substratevm + svm + + + + + + + + io.quarkus + quarkus-bootstrap-maven-plugin + + + maven-compiler-plugin + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + + + + diff --git a/extensions/artemis-core/runtime/src/main/java/io/quarkus/artemis/core/runtime/ArtemisBuildConfig.java b/extensions/artemis-core/runtime/src/main/java/io/quarkus/artemis/core/runtime/ArtemisBuildConfig.java new file mode 100644 index 0000000000000..836e9c5577599 --- /dev/null +++ b/extensions/artemis-core/runtime/src/main/java/io/quarkus/artemis/core/runtime/ArtemisBuildConfig.java @@ -0,0 +1,35 @@ +package io.quarkus.artemis.core.runtime; + +import java.util.Optional; + +import io.quarkus.runtime.annotations.ConfigItem; +import io.quarkus.runtime.annotations.ConfigPhase; +import io.quarkus.runtime.annotations.ConfigRoot; + +@ConfigRoot(name = "artemis", phase = ConfigPhase.BUILD_AND_RUN_TIME_FIXED) +public class ArtemisBuildConfig { + + public enum Protocol { + CORE, + JMS + } + + /** + * Artemis protocol, defaults to JMS if it is on classpath else to CORE + */ + @ConfigItem + public Optional protocol; + + public Protocol getProtocol() { + return protocol.orElseGet(ArtemisBuildConfig::getDefaultProtocol); + } + + public static Protocol getDefaultProtocol() { + try { + Class.forName("io.quarkus.artemis.jms.runtime.ArtemisJmsTemplate"); + return Protocol.JMS; + } catch (ClassNotFoundException e) { + return Protocol.CORE; + } + } +} diff --git a/extensions/artemis-core/runtime/src/main/java/io/quarkus/artemis/core/runtime/ArtemisCoreProducer.java b/extensions/artemis-core/runtime/src/main/java/io/quarkus/artemis/core/runtime/ArtemisCoreProducer.java new file mode 100644 index 0000000000000..44fa7a1d580d6 --- /dev/null +++ b/extensions/artemis-core/runtime/src/main/java/io/quarkus/artemis/core/runtime/ArtemisCoreProducer.java @@ -0,0 +1,26 @@ +package io.quarkus.artemis.core.runtime; + +import javax.enterprise.context.ApplicationScoped; +import javax.enterprise.inject.Produces; + +import org.apache.activemq.artemis.api.core.client.ActiveMQClient; +import org.apache.activemq.artemis.api.core.client.ServerLocator; + +@ApplicationScoped +public class ArtemisCoreProducer { + + private ArtemisRuntimeConfig config; + + @Produces + public ServerLocator produceServerLocator() throws Exception { + return ActiveMQClient.createServerLocator(config.url); + } + + public ArtemisRuntimeConfig getConfig() { + return config; + } + + public void setConfig(ArtemisRuntimeConfig config) { + this.config = config; + } +} diff --git a/extensions/artemis-core/runtime/src/main/java/io/quarkus/artemis/core/runtime/ArtemisCoreTemplate.java b/extensions/artemis-core/runtime/src/main/java/io/quarkus/artemis/core/runtime/ArtemisCoreTemplate.java new file mode 100644 index 0000000000000..201a645c650c8 --- /dev/null +++ b/extensions/artemis-core/runtime/src/main/java/io/quarkus/artemis/core/runtime/ArtemisCoreTemplate.java @@ -0,0 +1,12 @@ +package io.quarkus.artemis.core.runtime; + +import io.quarkus.arc.runtime.BeanContainer; +import io.quarkus.runtime.annotations.Template; + +@Template +public class ArtemisCoreTemplate { + + public void setConfig(ArtemisRuntimeConfig config, BeanContainer container) { + container.instance(ArtemisCoreProducer.class).setConfig(config); + } +} diff --git a/extensions/artemis-core/runtime/src/main/java/io/quarkus/artemis/core/runtime/ArtemisRuntimeConfig.java b/extensions/artemis-core/runtime/src/main/java/io/quarkus/artemis/core/runtime/ArtemisRuntimeConfig.java new file mode 100644 index 0000000000000..848597a230d99 --- /dev/null +++ b/extensions/artemis-core/runtime/src/main/java/io/quarkus/artemis/core/runtime/ArtemisRuntimeConfig.java @@ -0,0 +1,29 @@ +package io.quarkus.artemis.core.runtime; + +import java.util.Optional; + +import io.quarkus.runtime.annotations.ConfigItem; +import io.quarkus.runtime.annotations.ConfigPhase; +import io.quarkus.runtime.annotations.ConfigRoot; + +@ConfigRoot(name = "artemis", phase = ConfigPhase.RUN_TIME) +public class ArtemisRuntimeConfig { + + /** + * Artemis connection url + */ + @ConfigItem + public String url; + + /** + * Username for authentication, only used with JMS + */ + @ConfigItem + public Optional username; + + /** + * Password for authentication, only used with JMS + */ + @ConfigItem + public Optional password; +} diff --git a/extensions/artemis-core/runtime/src/main/java/io/quarkus/artemis/core/runtime/graal/CheckDependenciesSubstitutions.java b/extensions/artemis-core/runtime/src/main/java/io/quarkus/artemis/core/runtime/graal/CheckDependenciesSubstitutions.java new file mode 100644 index 0000000000000..7d3879bfc1b58 --- /dev/null +++ b/extensions/artemis-core/runtime/src/main/java/io/quarkus/artemis/core/runtime/graal/CheckDependenciesSubstitutions.java @@ -0,0 +1,20 @@ +package io.quarkus.artemis.core.runtime.graal; + +import com.oracle.svm.core.annotate.Substitute; +import com.oracle.svm.core.annotate.TargetClass; + +// Epoll and Kqueue are not supported on SVM +@Substitute +@TargetClass(org.apache.activemq.artemis.core.remoting.impl.netty.CheckDependencies.class) +final class CheckDependenciesSubstitutions { + + @Substitute + public static final boolean isEpollAvailable() { + return false; + } + + @Substitute + public static final boolean isKQueueAvailable() { + return false; + } +} diff --git a/extensions/artemis-jms/deployment/pom.xml b/extensions/artemis-jms/deployment/pom.xml new file mode 100644 index 0000000000000..039f864fb8cce --- /dev/null +++ b/extensions/artemis-jms/deployment/pom.xml @@ -0,0 +1,44 @@ + + + + io.quarkus + quarkus-artemis-jms-parent + 999-SNAPSHOT + + 4.0.0 + + quarkus-artemis-jms-deployment + Quarkus - Artemis - JMS - Deployment + + + + io.quarkus + quarkus-artemis-core-deployment + + + + io.quarkus + quarkus-artemis-jms + + + + + + + maven-compiler-plugin + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + + + + diff --git a/extensions/artemis-jms/deployment/src/main/java/io/quarkus/artemis/jms/deployment/ArtemisJmsProcessor.java b/extensions/artemis-jms/deployment/src/main/java/io/quarkus/artemis/jms/deployment/ArtemisJmsProcessor.java new file mode 100644 index 0000000000000..533874c9bd2cf --- /dev/null +++ b/extensions/artemis-jms/deployment/src/main/java/io/quarkus/artemis/jms/deployment/ArtemisJmsProcessor.java @@ -0,0 +1,38 @@ +package io.quarkus.artemis.jms.deployment; + +import io.quarkus.arc.deployment.AdditionalBeanBuildItem; +import io.quarkus.arc.deployment.BeanContainerBuildItem; +import io.quarkus.artemis.core.runtime.ArtemisBuildConfig; +import io.quarkus.artemis.core.runtime.ArtemisRuntimeConfig; +import io.quarkus.artemis.jms.runtime.ArtemisJmsProducer; +import io.quarkus.artemis.jms.runtime.ArtemisJmsTemplate; +import io.quarkus.deployment.annotations.BuildProducer; +import io.quarkus.deployment.annotations.BuildStep; +import io.quarkus.deployment.annotations.ExecutionTime; +import io.quarkus.deployment.annotations.Record; +import io.quarkus.deployment.builditem.FeatureBuildItem; + +public class ArtemisJmsProcessor { + + @BuildStep + @Record(ExecutionTime.STATIC_INIT) + void load(ArtemisBuildConfig config, BuildProducer additionalBean, + BuildProducer feature) { + + if (config.getProtocol() != ArtemisBuildConfig.Protocol.JMS) { + return; + } + feature.produce(new FeatureBuildItem(FeatureBuildItem.ARTEMIS_JMS)); + additionalBean.produce(AdditionalBeanBuildItem.unremovableOf(ArtemisJmsProducer.class)); + } + + @Record(ExecutionTime.RUNTIME_INIT) + @BuildStep + void configure(ArtemisBuildConfig buildConfig, ArtemisJmsTemplate template, ArtemisRuntimeConfig runtimeConfig, + BeanContainerBuildItem beanContainer) { + + if (buildConfig.getProtocol() == ArtemisBuildConfig.Protocol.JMS) { + template.setConfig(runtimeConfig, beanContainer.getValue()); + } + } +} diff --git a/extensions/artemis-jms/pom.xml b/extensions/artemis-jms/pom.xml new file mode 100644 index 0000000000000..73b6fa958f5d1 --- /dev/null +++ b/extensions/artemis-jms/pom.xml @@ -0,0 +1,21 @@ + + + + quarkus-build-parent + io.quarkus + 999-SNAPSHOT + ../../build-parent/pom.xml + + + 4.0.0 + quarkus-artemis-jms-parent + Quarkus - Artemis - JMS + pom + + + deployment + runtime + + diff --git a/extensions/artemis-jms/runtime/pom.xml b/extensions/artemis-jms/runtime/pom.xml new file mode 100644 index 0000000000000..dd998a08444dc --- /dev/null +++ b/extensions/artemis-jms/runtime/pom.xml @@ -0,0 +1,49 @@ + + + + io.quarkus + quarkus-artemis-jms-parent + 999-SNAPSHOT + + 4.0.0 + + quarkus-artemis-jms + Quarkus - Artemis - JMS - Runtime + + + + io.quarkus + quarkus-artemis-core + + + + org.apache.activemq + artemis-jms-client + + + + + + + + io.quarkus + quarkus-bootstrap-maven-plugin + + + maven-compiler-plugin + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + + + + diff --git a/extensions/artemis-jms/runtime/src/main/java/io/quarkus/artemis/jms/runtime/ArtemisJmsProducer.java b/extensions/artemis-jms/runtime/src/main/java/io/quarkus/artemis/jms/runtime/ArtemisJmsProducer.java new file mode 100644 index 0000000000000..c23fe7bf354f9 --- /dev/null +++ b/extensions/artemis-jms/runtime/src/main/java/io/quarkus/artemis/jms/runtime/ArtemisJmsProducer.java @@ -0,0 +1,28 @@ +package io.quarkus.artemis.jms.runtime; + +import javax.enterprise.context.ApplicationScoped; +import javax.enterprise.inject.Produces; + +import org.apache.activemq.artemis.jms.client.ActiveMQJMSConnectionFactory; + +import io.quarkus.artemis.core.runtime.ArtemisRuntimeConfig; + +@ApplicationScoped +public class ArtemisJmsProducer { + + private ArtemisRuntimeConfig config; + + @Produces + public ActiveMQJMSConnectionFactory producesConnectionFactory() { + return new ActiveMQJMSConnectionFactory(config.url, + config.username.orElse(null), config.password.orElse(null)); + } + + public ArtemisRuntimeConfig getConfig() { + return config; + } + + public void setConfig(ArtemisRuntimeConfig config) { + this.config = config; + } +} diff --git a/extensions/artemis-jms/runtime/src/main/java/io/quarkus/artemis/jms/runtime/ArtemisJmsTemplate.java b/extensions/artemis-jms/runtime/src/main/java/io/quarkus/artemis/jms/runtime/ArtemisJmsTemplate.java new file mode 100644 index 0000000000000..bbb282e98a6e3 --- /dev/null +++ b/extensions/artemis-jms/runtime/src/main/java/io/quarkus/artemis/jms/runtime/ArtemisJmsTemplate.java @@ -0,0 +1,13 @@ +package io.quarkus.artemis.jms.runtime; + +import io.quarkus.arc.runtime.BeanContainer; +import io.quarkus.artemis.core.runtime.ArtemisRuntimeConfig; +import io.quarkus.runtime.annotations.Template; + +@Template +public class ArtemisJmsTemplate { + + public void setConfig(ArtemisRuntimeConfig config, BeanContainer container) { + container.instance(ArtemisJmsProducer.class).setConfig(config); + } +} diff --git a/extensions/infinispan-client/deployment/src/main/java/io/quarkus/infinispan/client/deployment/InfinispanClientProcessor.java b/extensions/infinispan-client/deployment/src/main/java/io/quarkus/infinispan/client/deployment/InfinispanClientProcessor.java index 13200477c7679..62b8131f2d4b3 100644 --- a/extensions/infinispan-client/deployment/src/main/java/io/quarkus/infinispan/client/deployment/InfinispanClientProcessor.java +++ b/extensions/infinispan-client/deployment/src/main/java/io/quarkus/infinispan/client/deployment/InfinispanClientProcessor.java @@ -48,6 +48,7 @@ import io.quarkus.deployment.builditem.HotDeploymentWatchedFileBuildItem; import io.quarkus.deployment.builditem.SystemPropertyBuildItem; import io.quarkus.deployment.builditem.substrate.ReflectiveClassBuildItem; +import io.quarkus.deployment.builditem.substrate.SubstrateConfigBuildItem; import io.quarkus.infinispan.client.runtime.InfinispanClientBuildTimeConfig; import io.quarkus.infinispan.client.runtime.InfinispanClientProducer; import io.quarkus.infinispan.client.runtime.InfinispanClientRuntimeConfig; @@ -73,6 +74,7 @@ InfinispanPropertiesBuildItem setup(ApplicationArchivesBuildItem applicationArch BuildProducer feature, BuildProducer additionalBeans, BuildProducer sslNativeSupport, + BuildProducer substrateConfig, ApplicationIndexBuildItem applicationIndexBuildItem) throws ClassNotFoundException, IOException { feature.produce(new FeatureBuildItem(FeatureBuildItem.INFINISPAN_CLIENT)); @@ -154,6 +156,9 @@ InfinispanPropertiesBuildItem setup(ApplicationArchivesBuildItem applicationArch // This is required for netty to work properly reflectiveClass.produce(new ReflectiveClassBuildItem(false, false, "io.netty.channel.socket.nio.NioSocketChannel")); + substrateConfig.produce(SubstrateConfigBuildItem.builder() + .addRuntimeInitializedClass("org.infinispan.client.hotrod.impl.transport.netty.TransportHelper") + .build()); // We use reflection to have continuous queries work reflectiveClass.produce(new ReflectiveClassBuildItem(true, false, "org.infinispan.client.hotrod.event.impl.ContinuousQueryImpl$ClientEntryListener")); diff --git a/extensions/netty/deployment/src/main/java/io/quarkus/netty/deployment/NettyProcessor.java b/extensions/netty/deployment/src/main/java/io/quarkus/netty/deployment/NettyProcessor.java index ea17730947fa2..e52e86f557862 100644 --- a/extensions/netty/deployment/src/main/java/io/quarkus/netty/deployment/NettyProcessor.java +++ b/extensions/netty/deployment/src/main/java/io/quarkus/netty/deployment/NettyProcessor.java @@ -48,6 +48,40 @@ SubstrateConfigBuildItem build() { //ignore log.debug("Not registering Netty HTTP classes as they were not found"); } + + try { + Class.forName("io.netty.channel.unix.UnixChannel"); + builder.addRuntimeInitializedClass("io.netty.channel.unix.Errors") + .addRuntimeInitializedClass("io.netty.channel.unix.FileDescriptor") + .addRuntimeInitializedClass("io.netty.channel.unix.IovArray") + .addRuntimeInitializedClass("io.netty.channel.unix.Limits"); + } catch (ClassNotFoundException e) { + //ignore + log.debug("Not registering Netty native unix classes as they were not found"); + } + + try { + Class.forName("io.netty.channel.epoll.EpollMode"); + builder.addRuntimeInitializedClass("io.netty.channel.epoll.Epoll") + .addRuntimeInitializedClass("io.netty.channel.epoll.EpollEventArray") + .addRuntimeInitializedClass("io.netty.channel.epoll.EpollEventLoop") + .addRuntimeInitializedClass("io.netty.channel.epoll.Native"); + } catch (ClassNotFoundException e) { + //ignore + log.debug("Not registering Netty native epoll classes as they were not found"); + } + + try { + Class.forName("io.netty.channel.kqueue.AcceptFilter"); + builder.addRuntimeInitializedClass("io.netty.channel.kqueue.KQueue") + .addRuntimeInitializedClass("io.netty.channel.kqueue.KQueueEventArray") + .addRuntimeInitializedClass("io.netty.channel.kqueue.KQueueEventLoop") + .addRuntimeInitializedClass("io.netty.channel.kqueue.Native"); + } catch (ClassNotFoundException e) { + //ignore + log.debug("Not registering Netty native kqueue classes as they were not found"); + } + return builder //TODO: make configurable .build(); } diff --git a/extensions/pom.xml b/extensions/pom.xml index a13ac3afce6c2..ba0c56d0fa191 100644 --- a/extensions/pom.xml +++ b/extensions/pom.xml @@ -74,6 +74,8 @@ tika neo4j mongodb-client + artemis-core + artemis-jms spring-di diff --git a/integration-tests/artemis-core/pom.xml b/integration-tests/artemis-core/pom.xml new file mode 100644 index 0000000000000..022f00a63eb91 --- /dev/null +++ b/integration-tests/artemis-core/pom.xml @@ -0,0 +1,128 @@ + + + + quarkus-integration-tests-parent + io.quarkus + 999-SNAPSHOT + + 4.0.0 + + quarkus-integration-test-artemis-core + Quarkus - Integration Tests - Artemis - Core + The Apache ActiveMQ Artemis Core integration tests module + + + true + + + + + + io.quarkus + quarkus-resteasy + + + + + io.quarkus + quarkus-artemis-core + + + + + io.quarkus + quarkus-junit5 + test + + + io.rest-assured + rest-assured + test + + + org.apache.activemq + artemis-server + ${artemis.version} + test + + + org.jboss.logmanager + jboss-logmanager + + + + + + + + + ${project.groupId} + quarkus-maven-plugin + + + + build + + + + + + + + + + native-image + + + native + + + + + + org.apache.maven.plugins + maven-failsafe-plugin + + + + integration-test + verify + + + + ${project.build.directory}/${project.build.finalName}-runner + + + + + + + ${project.groupId} + quarkus-maven-plugin + + + native-image + + native-image + + + true + true + true + + ${graalvmHome} + + + + + + + + + + diff --git a/integration-tests/artemis-core/src/main/java/io/quarkus/it/artemis/ArtemisConsumerManager.java b/integration-tests/artemis-core/src/main/java/io/quarkus/it/artemis/ArtemisConsumerManager.java new file mode 100644 index 0000000000000..3f0bcff7408cf --- /dev/null +++ b/integration-tests/artemis-core/src/main/java/io/quarkus/it/artemis/ArtemisConsumerManager.java @@ -0,0 +1,36 @@ +package io.quarkus.it.artemis; + +import javax.annotation.PostConstruct; +import javax.enterprise.context.ApplicationScoped; +import javax.inject.Inject; + +import org.apache.activemq.artemis.api.core.ActiveMQException; +import org.apache.activemq.artemis.api.core.client.ClientMessage; +import org.apache.activemq.artemis.api.core.client.ClientSession; +import org.apache.activemq.artemis.api.core.client.ClientSessionFactory; +import org.apache.activemq.artemis.api.core.client.ServerLocator; + +@ApplicationScoped +public class ArtemisConsumerManager { + + @Inject + ServerLocator serverLocator; + + private ClientSessionFactory connection; + + @PostConstruct + public void init() throws Exception { + connection = serverLocator.createSessionFactory(); + } + + public String receive() { + try (ClientSession session = connection.createSession()) { + session.start(); + ClientMessage message = session.createConsumer("test-core").receive(1000L); + message.acknowledge(); + return message.getBodyBuffer().readString(); + } catch (ActiveMQException e) { + throw new RuntimeException("Could not receive message", e); + } + } +} diff --git a/integration-tests/artemis-core/src/main/java/io/quarkus/it/artemis/ArtemisEndpoint.java b/integration-tests/artemis-core/src/main/java/io/quarkus/it/artemis/ArtemisEndpoint.java new file mode 100644 index 0000000000000..09fcc62d76fd6 --- /dev/null +++ b/integration-tests/artemis-core/src/main/java/io/quarkus/it/artemis/ArtemisEndpoint.java @@ -0,0 +1,26 @@ +package io.quarkus.it.artemis; + +import javax.inject.Inject; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; + +@Path("/artemis") +public class ArtemisEndpoint { + + @Inject + ArtemisProducerManager producer; + + @Inject + ArtemisConsumerManager consumer; + + @POST + public void post(String message) { + producer.send(message); + } + + @GET + public String get() { + return consumer.receive(); + } +} diff --git a/integration-tests/artemis-core/src/main/java/io/quarkus/it/artemis/ArtemisProducerManager.java b/integration-tests/artemis-core/src/main/java/io/quarkus/it/artemis/ArtemisProducerManager.java new file mode 100644 index 0000000000000..c2dc9f9db748f --- /dev/null +++ b/integration-tests/artemis-core/src/main/java/io/quarkus/it/artemis/ArtemisProducerManager.java @@ -0,0 +1,35 @@ +package io.quarkus.it.artemis; + +import javax.annotation.PostConstruct; +import javax.enterprise.context.ApplicationScoped; +import javax.inject.Inject; + +import org.apache.activemq.artemis.api.core.ActiveMQException; +import org.apache.activemq.artemis.api.core.client.ClientMessage; +import org.apache.activemq.artemis.api.core.client.ClientSession; +import org.apache.activemq.artemis.api.core.client.ClientSessionFactory; +import org.apache.activemq.artemis.api.core.client.ServerLocator; + +@ApplicationScoped +public class ArtemisProducerManager { + + @Inject + ServerLocator serverLocator; + + private ClientSessionFactory connection; + + @PostConstruct + public void init() throws Exception { + connection = serverLocator.createSessionFactory(); + } + + public void send(String body) { + try (ClientSession session = connection.createSession()) { + ClientMessage message = session.createMessage(true); + message.getBodyBuffer().writeString(body); + session.createProducer("test-core").send(message); + } catch (ActiveMQException e) { + throw new RuntimeException("Could not send message", e); + } + } +} diff --git a/integration-tests/artemis-core/src/main/resources/application.properties b/integration-tests/artemis-core/src/main/resources/application.properties new file mode 100644 index 0000000000000..d7f1552f7a3ae --- /dev/null +++ b/integration-tests/artemis-core/src/main/resources/application.properties @@ -0,0 +1 @@ +quarkus.artemis.url=tcp://localhost:61616 diff --git a/integration-tests/artemis-core/src/test/java/io/quarkus/it/artemis/ArtemisConsumerITCase.java b/integration-tests/artemis-core/src/test/java/io/quarkus/it/artemis/ArtemisConsumerITCase.java new file mode 100644 index 0000000000000..062348efe2579 --- /dev/null +++ b/integration-tests/artemis-core/src/test/java/io/quarkus/it/artemis/ArtemisConsumerITCase.java @@ -0,0 +1,8 @@ +package io.quarkus.it.artemis; + +import io.quarkus.test.junit.SubstrateTest; + +@SubstrateTest +public class ArtemisConsumerITCase extends ArtemisConsumerTest { + +} diff --git a/integration-tests/artemis-core/src/test/java/io/quarkus/it/artemis/ArtemisConsumerTest.java b/integration-tests/artemis-core/src/test/java/io/quarkus/it/artemis/ArtemisConsumerTest.java new file mode 100644 index 0000000000000..6c1bee7d93462 --- /dev/null +++ b/integration-tests/artemis-core/src/test/java/io/quarkus/it/artemis/ArtemisConsumerTest.java @@ -0,0 +1,31 @@ +package io.quarkus.it.artemis; + +import org.apache.activemq.artemis.api.core.client.ClientMessage; +import org.apache.activemq.artemis.api.core.client.ClientSession; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import io.quarkus.test.common.QuarkusTestResource; +import io.quarkus.test.junit.QuarkusTest; +import io.restassured.RestAssured; +import io.restassured.response.Response; +import io.undertow.httpcore.StatusCodes; + +@QuarkusTest +@QuarkusTestResource(ArtemisTestResource.class) +public class ArtemisConsumerTest implements ArtemisHelper { + + @Test + public void test() throws Exception { + String body = createBody(); + try (ClientSession session = createSession()) { + ClientMessage message = session.createMessage(true); + message.getBodyBuffer().writeString(body); + session.createProducer("test-core").send(message); + } + + Response response = RestAssured.with().body(body).get("/artemis"); + Assertions.assertEquals(StatusCodes.OK, response.statusCode()); + Assertions.assertEquals(body, response.getBody().asString()); + } +} diff --git a/integration-tests/artemis-core/src/test/java/io/quarkus/it/artemis/ArtemisHelper.java b/integration-tests/artemis-core/src/test/java/io/quarkus/it/artemis/ArtemisHelper.java new file mode 100644 index 0000000000000..da1b14a8a2566 --- /dev/null +++ b/integration-tests/artemis-core/src/test/java/io/quarkus/it/artemis/ArtemisHelper.java @@ -0,0 +1,17 @@ +package io.quarkus.it.artemis; + +import java.util.Random; + +import org.apache.activemq.artemis.api.core.client.ActiveMQClient; +import org.apache.activemq.artemis.api.core.client.ClientSession; + +public interface ArtemisHelper { + + default String createBody() { + return Integer.toString(new Random().nextInt(Integer.MAX_VALUE), 16); + } + + default ClientSession createSession() throws Exception { + return ActiveMQClient.createServerLocator("tcp://localhost:61616").createSessionFactory().createSession(); + } +} diff --git a/integration-tests/artemis-core/src/test/java/io/quarkus/it/artemis/ArtemisProducerITCase.java b/integration-tests/artemis-core/src/test/java/io/quarkus/it/artemis/ArtemisProducerITCase.java new file mode 100644 index 0000000000000..d8aea4c888df5 --- /dev/null +++ b/integration-tests/artemis-core/src/test/java/io/quarkus/it/artemis/ArtemisProducerITCase.java @@ -0,0 +1,8 @@ +package io.quarkus.it.artemis; + +import io.quarkus.test.junit.SubstrateTest; + +@SubstrateTest +public class ArtemisProducerITCase extends ArtemisProducerTest { + +} diff --git a/integration-tests/artemis-core/src/test/java/io/quarkus/it/artemis/ArtemisProducerTest.java b/integration-tests/artemis-core/src/test/java/io/quarkus/it/artemis/ArtemisProducerTest.java new file mode 100644 index 0000000000000..609b1d2567f93 --- /dev/null +++ b/integration-tests/artemis-core/src/test/java/io/quarkus/it/artemis/ArtemisProducerTest.java @@ -0,0 +1,31 @@ +package io.quarkus.it.artemis; + +import org.apache.activemq.artemis.api.core.client.ClientMessage; +import org.apache.activemq.artemis.api.core.client.ClientSession; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import io.quarkus.test.common.QuarkusTestResource; +import io.quarkus.test.junit.QuarkusTest; +import io.restassured.RestAssured; +import io.restassured.response.Response; +import io.undertow.httpcore.StatusCodes; + +@QuarkusTest +@QuarkusTestResource(ArtemisTestResource.class) +public class ArtemisProducerTest implements ArtemisHelper { + + @Test + public void test() throws Exception { + String body = createBody(); + Response response = RestAssured.with().body(body).post("/artemis"); + Assertions.assertEquals(StatusCodes.NO_CONTENT, response.statusCode()); + + try (ClientSession session = createSession()) { + session.start(); + ClientMessage message = session.createConsumer("test-core").receive(1000L); + message.acknowledge(); + Assertions.assertEquals(body, message.getBodyBuffer().readString()); + } + } +} diff --git a/integration-tests/artemis-core/src/test/java/io/quarkus/it/artemis/ArtemisTestResource.java b/integration-tests/artemis-core/src/test/java/io/quarkus/it/artemis/ArtemisTestResource.java new file mode 100644 index 0000000000000..581cde9b6f67d --- /dev/null +++ b/integration-tests/artemis-core/src/test/java/io/quarkus/it/artemis/ArtemisTestResource.java @@ -0,0 +1,36 @@ +package io.quarkus.it.artemis; + +import java.nio.file.Paths; +import java.util.Collections; +import java.util.Map; + +import org.apache.activemq.artemis.core.server.embedded.EmbeddedActiveMQ; +import org.apache.commons.io.FileUtils; + +import io.quarkus.test.common.QuarkusTestResourceLifecycleManager; + +public class ArtemisTestResource implements QuarkusTestResourceLifecycleManager { + + private EmbeddedActiveMQ embedded; + + @Override + public Map start() { + try { + FileUtils.deleteDirectory(Paths.get("./target/artemis").toFile()); + embedded = new EmbeddedActiveMQ(); + embedded.start(); + } catch (Exception e) { + throw new RuntimeException("Could not start embedded ActiveMQ server", e); + } + return Collections.emptyMap(); + } + + @Override + public void stop() { + try { + embedded.stop(); + } catch (Exception e) { + throw new RuntimeException("Could not stop embedded ActiveMQ server", e); + } + } +} diff --git a/integration-tests/artemis-core/src/test/resources/broker.xml b/integration-tests/artemis-core/src/test/resources/broker.xml new file mode 100644 index 0000000000000..ebc7ccd91575d --- /dev/null +++ b/integration-tests/artemis-core/src/test/resources/broker.xml @@ -0,0 +1,25 @@ + + + ./target/artemis/paging + ./target/artemis/bindings + ./target/artemis/journal + ./target/artemis/large-messages + + + tcp://localhost:61616 + + + tcp://localhost:61616 + + + false + + +
+ + + +
+
+
+
diff --git a/integration-tests/artemis-jms/pom.xml b/integration-tests/artemis-jms/pom.xml new file mode 100644 index 0000000000000..0d4f336fb38db --- /dev/null +++ b/integration-tests/artemis-jms/pom.xml @@ -0,0 +1,128 @@ + + + + quarkus-integration-tests-parent + io.quarkus + 999-SNAPSHOT + + 4.0.0 + + quarkus-integration-test-artemis-jms + Quarkus - Integration Tests - Artemis - JMS + The Apache ActiveMQ Artemis JMS integration tests module + + + true + + + + + + io.quarkus + quarkus-resteasy + + + + + io.quarkus + quarkus-artemis-jms + + + + + io.quarkus + quarkus-junit5 + test + + + io.rest-assured + rest-assured + test + + + org.apache.activemq + artemis-server + ${artemis.version} + test + + + org.jboss.logmanager + jboss-logmanager + + + + + + + + + ${project.groupId} + quarkus-maven-plugin + + + + build + + + + + + + + + + native-image + + + native + + + + + + org.apache.maven.plugins + maven-failsafe-plugin + + + + integration-test + verify + + + + ${project.build.directory}/${project.build.finalName}-runner + + + + + + + ${project.groupId} + quarkus-maven-plugin + + + native-image + + native-image + + + true + true + true + + ${graalvmHome} + + + + + + + + + + diff --git a/integration-tests/artemis-jms/src/main/java/io/quarkus/it/artemis/ArtemisConsumerManager.java b/integration-tests/artemis-jms/src/main/java/io/quarkus/it/artemis/ArtemisConsumerManager.java new file mode 100644 index 0000000000000..145f6b95b54a7 --- /dev/null +++ b/integration-tests/artemis-jms/src/main/java/io/quarkus/it/artemis/ArtemisConsumerManager.java @@ -0,0 +1,35 @@ +package io.quarkus.it.artemis; + +import javax.annotation.PostConstruct; +import javax.enterprise.context.ApplicationScoped; +import javax.inject.Inject; +import javax.jms.Connection; +import javax.jms.JMSException; +import javax.jms.MessageConsumer; +import javax.jms.Session; + +import org.apache.activemq.artemis.jms.client.ActiveMQJMSConnectionFactory; + +@ApplicationScoped +public class ArtemisConsumerManager { + + @Inject + ActiveMQJMSConnectionFactory connectionFactory; + + private Connection connection; + + @PostConstruct + public void init() throws JMSException { + connection = connectionFactory.createConnection(); + connection.start(); + } + + public String receive() { + try (Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE)) { + MessageConsumer consumer = session.createConsumer(session.createQueue("test-jms")); + return consumer.receive(1000L).getBody(String.class); + } catch (JMSException e) { + throw new RuntimeException("Could not receive message", e); + } + } +} diff --git a/integration-tests/artemis-jms/src/main/java/io/quarkus/it/artemis/ArtemisEndpoint.java b/integration-tests/artemis-jms/src/main/java/io/quarkus/it/artemis/ArtemisEndpoint.java new file mode 100644 index 0000000000000..09fcc62d76fd6 --- /dev/null +++ b/integration-tests/artemis-jms/src/main/java/io/quarkus/it/artemis/ArtemisEndpoint.java @@ -0,0 +1,26 @@ +package io.quarkus.it.artemis; + +import javax.inject.Inject; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; + +@Path("/artemis") +public class ArtemisEndpoint { + + @Inject + ArtemisProducerManager producer; + + @Inject + ArtemisConsumerManager consumer; + + @POST + public void post(String message) { + producer.send(message); + } + + @GET + public String get() { + return consumer.receive(); + } +} diff --git a/integration-tests/artemis-jms/src/main/java/io/quarkus/it/artemis/ArtemisProducerManager.java b/integration-tests/artemis-jms/src/main/java/io/quarkus/it/artemis/ArtemisProducerManager.java new file mode 100644 index 0000000000000..13f86da92f036 --- /dev/null +++ b/integration-tests/artemis-jms/src/main/java/io/quarkus/it/artemis/ArtemisProducerManager.java @@ -0,0 +1,34 @@ +package io.quarkus.it.artemis; + +import javax.annotation.PostConstruct; +import javax.enterprise.context.ApplicationScoped; +import javax.inject.Inject; +import javax.jms.Connection; +import javax.jms.JMSException; +import javax.jms.MessageProducer; +import javax.jms.Session; + +import org.apache.activemq.artemis.jms.client.ActiveMQJMSConnectionFactory; + +@ApplicationScoped +public class ArtemisProducerManager { + + @Inject + ActiveMQJMSConnectionFactory connectionFactory; + + private Connection connection; + + @PostConstruct + public void init() throws JMSException { + connection = connectionFactory.createConnection(); + } + + public void send(String body) { + try (Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE)) { + MessageProducer producer = session.createProducer(session.createQueue("test-jms")); + producer.send(session.createTextMessage(body)); + } catch (JMSException e) { + throw new RuntimeException("Could not send message", e); + } + } +} diff --git a/integration-tests/artemis-jms/src/main/resources/application.properties b/integration-tests/artemis-jms/src/main/resources/application.properties new file mode 100644 index 0000000000000..d7f1552f7a3ae --- /dev/null +++ b/integration-tests/artemis-jms/src/main/resources/application.properties @@ -0,0 +1 @@ +quarkus.artemis.url=tcp://localhost:61616 diff --git a/integration-tests/artemis-jms/src/test/java/io/quarkus/it/artemis/ArtemisConsumerITCase.java b/integration-tests/artemis-jms/src/test/java/io/quarkus/it/artemis/ArtemisConsumerITCase.java new file mode 100644 index 0000000000000..062348efe2579 --- /dev/null +++ b/integration-tests/artemis-jms/src/test/java/io/quarkus/it/artemis/ArtemisConsumerITCase.java @@ -0,0 +1,8 @@ +package io.quarkus.it.artemis; + +import io.quarkus.test.junit.SubstrateTest; + +@SubstrateTest +public class ArtemisConsumerITCase extends ArtemisConsumerTest { + +} diff --git a/integration-tests/artemis-jms/src/test/java/io/quarkus/it/artemis/ArtemisConsumerTest.java b/integration-tests/artemis-jms/src/test/java/io/quarkus/it/artemis/ArtemisConsumerTest.java new file mode 100644 index 0000000000000..d7e6aee554a2b --- /dev/null +++ b/integration-tests/artemis-jms/src/test/java/io/quarkus/it/artemis/ArtemisConsumerTest.java @@ -0,0 +1,29 @@ +package io.quarkus.it.artemis; + +import javax.jms.Session; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import io.quarkus.test.common.QuarkusTestResource; +import io.quarkus.test.junit.QuarkusTest; +import io.restassured.RestAssured; +import io.restassured.response.Response; +import io.undertow.httpcore.StatusCodes; + +@QuarkusTest +@QuarkusTestResource(ArtemisTestResource.class) +public class ArtemisConsumerTest implements ArtemisHelper { + + @Test + public void test() throws Exception { + String body = createBody(); + try (Session session = createSession()) { + session.createProducer(session.createQueue("test-jms")).send(session.createTextMessage(body)); + } + + Response response = RestAssured.with().body(body).get("/artemis"); + Assertions.assertEquals(StatusCodes.OK, response.statusCode()); + Assertions.assertEquals(body, response.getBody().asString()); + } +} diff --git a/integration-tests/artemis-jms/src/test/java/io/quarkus/it/artemis/ArtemisHelper.java b/integration-tests/artemis-jms/src/test/java/io/quarkus/it/artemis/ArtemisHelper.java new file mode 100644 index 0000000000000..33dd8511cb72f --- /dev/null +++ b/integration-tests/artemis-jms/src/test/java/io/quarkus/it/artemis/ArtemisHelper.java @@ -0,0 +1,22 @@ +package io.quarkus.it.artemis; + +import java.util.Random; + +import javax.jms.Connection; +import javax.jms.JMSException; +import javax.jms.Session; + +import org.apache.activemq.artemis.jms.client.ActiveMQJMSConnectionFactory; + +public interface ArtemisHelper { + + default String createBody() { + return Integer.toString(new Random().nextInt(Integer.MAX_VALUE), 16); + } + + default Session createSession() throws JMSException { + Connection connection = new ActiveMQJMSConnectionFactory("tcp://localhost:61616").createConnection(); + connection.start(); + return connection.createSession(false, Session.AUTO_ACKNOWLEDGE); + } +} diff --git a/integration-tests/artemis-jms/src/test/java/io/quarkus/it/artemis/ArtemisProducerITCase.java b/integration-tests/artemis-jms/src/test/java/io/quarkus/it/artemis/ArtemisProducerITCase.java new file mode 100644 index 0000000000000..d8aea4c888df5 --- /dev/null +++ b/integration-tests/artemis-jms/src/test/java/io/quarkus/it/artemis/ArtemisProducerITCase.java @@ -0,0 +1,8 @@ +package io.quarkus.it.artemis; + +import io.quarkus.test.junit.SubstrateTest; + +@SubstrateTest +public class ArtemisProducerITCase extends ArtemisProducerTest { + +} diff --git a/integration-tests/artemis-jms/src/test/java/io/quarkus/it/artemis/ArtemisProducerTest.java b/integration-tests/artemis-jms/src/test/java/io/quarkus/it/artemis/ArtemisProducerTest.java new file mode 100644 index 0000000000000..11238b6bc4107 --- /dev/null +++ b/integration-tests/artemis-jms/src/test/java/io/quarkus/it/artemis/ArtemisProducerTest.java @@ -0,0 +1,32 @@ +package io.quarkus.it.artemis; + +import javax.jms.Message; +import javax.jms.MessageConsumer; +import javax.jms.Session; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import io.quarkus.test.common.QuarkusTestResource; +import io.quarkus.test.junit.QuarkusTest; +import io.restassured.RestAssured; +import io.restassured.response.Response; +import io.undertow.httpcore.StatusCodes; + +@QuarkusTest +@QuarkusTestResource(ArtemisTestResource.class) +public class ArtemisProducerTest implements ArtemisHelper { + + @Test + public void test() throws Exception { + String body = createBody(); + Response response = RestAssured.with().body(body).post("/artemis"); + Assertions.assertEquals(StatusCodes.NO_CONTENT, response.statusCode()); + + try (Session session = createSession()) { + MessageConsumer consumer = session.createConsumer(session.createQueue("test-jms")); + Message message = consumer.receive(1000L); + Assertions.assertEquals(body, message.getBody(String.class)); + } + } +} diff --git a/integration-tests/artemis-jms/src/test/java/io/quarkus/it/artemis/ArtemisTestResource.java b/integration-tests/artemis-jms/src/test/java/io/quarkus/it/artemis/ArtemisTestResource.java new file mode 100644 index 0000000000000..581cde9b6f67d --- /dev/null +++ b/integration-tests/artemis-jms/src/test/java/io/quarkus/it/artemis/ArtemisTestResource.java @@ -0,0 +1,36 @@ +package io.quarkus.it.artemis; + +import java.nio.file.Paths; +import java.util.Collections; +import java.util.Map; + +import org.apache.activemq.artemis.core.server.embedded.EmbeddedActiveMQ; +import org.apache.commons.io.FileUtils; + +import io.quarkus.test.common.QuarkusTestResourceLifecycleManager; + +public class ArtemisTestResource implements QuarkusTestResourceLifecycleManager { + + private EmbeddedActiveMQ embedded; + + @Override + public Map start() { + try { + FileUtils.deleteDirectory(Paths.get("./target/artemis").toFile()); + embedded = new EmbeddedActiveMQ(); + embedded.start(); + } catch (Exception e) { + throw new RuntimeException("Could not start embedded ActiveMQ server", e); + } + return Collections.emptyMap(); + } + + @Override + public void stop() { + try { + embedded.stop(); + } catch (Exception e) { + throw new RuntimeException("Could not stop embedded ActiveMQ server", e); + } + } +} diff --git a/integration-tests/artemis-jms/src/test/resources/broker.xml b/integration-tests/artemis-jms/src/test/resources/broker.xml new file mode 100644 index 0000000000000..b3e4ec0d49861 --- /dev/null +++ b/integration-tests/artemis-jms/src/test/resources/broker.xml @@ -0,0 +1,23 @@ + + + ./target/artemis/paging + ./target/artemis/bindings + ./target/artemis/journal + ./target/artemis/large-messages + + + tcp://localhost:61616 + + + tcp://localhost:61616 + + + false + + + +
test-jms
+
+
+
+
diff --git a/integration-tests/pom.xml b/integration-tests/pom.xml index dc81db73ae607..840f9c654eaf7 100644 --- a/integration-tests/pom.xml +++ b/integration-tests/pom.xml @@ -54,6 +54,8 @@ resteasy-jackson jgit virtual-http + artemis-core + artemis-jms From 9c12805163ea679a1e5c2d1a59ced0f70744416f Mon Sep 17 00:00:00 2001 From: Jacob Middag Date: Tue, 25 Jun 2019 22:06:23 +0200 Subject: [PATCH 2/6] Use BuildItem to indicate if JMS should be used instead of Core --- .../core/deployment/ArtemisCoreProcessor.java | 19 +++++----- .../core/deployment/ArtemisJmsBuildItem.java | 9 +++++ .../core/runtime/ArtemisBuildConfig.java | 35 ------------------- .../jms/deployment/ArtemisJmsProcessor.java | 17 ++++----- 4 files changed, 24 insertions(+), 56 deletions(-) create mode 100644 extensions/artemis-core/deployment/src/main/java/io/quarkus/artemis/core/deployment/ArtemisJmsBuildItem.java delete mode 100644 extensions/artemis-core/runtime/src/main/java/io/quarkus/artemis/core/runtime/ArtemisBuildConfig.java diff --git a/extensions/artemis-core/deployment/src/main/java/io/quarkus/artemis/core/deployment/ArtemisCoreProcessor.java b/extensions/artemis-core/deployment/src/main/java/io/quarkus/artemis/core/deployment/ArtemisCoreProcessor.java index 46b9fb8aea57d..14c177858ed34 100644 --- a/extensions/artemis-core/deployment/src/main/java/io/quarkus/artemis/core/deployment/ArtemisCoreProcessor.java +++ b/extensions/artemis-core/deployment/src/main/java/io/quarkus/artemis/core/deployment/ArtemisCoreProcessor.java @@ -1,6 +1,7 @@ package io.quarkus.artemis.core.deployment; import java.util.Collection; +import java.util.Optional; import org.apache.activemq.artemis.api.core.client.loadbalance.ConnectionLoadBalancingPolicy; import org.apache.activemq.artemis.api.core.client.loadbalance.FirstElementConnectionLoadBalancingPolicy; @@ -17,7 +18,6 @@ import io.quarkus.arc.deployment.AdditionalBeanBuildItem; import io.quarkus.arc.deployment.BeanContainerBuildItem; -import io.quarkus.artemis.core.runtime.ArtemisBuildConfig; import io.quarkus.artemis.core.runtime.ArtemisCoreProducer; import io.quarkus.artemis.core.runtime.ArtemisCoreTemplate; import io.quarkus.artemis.core.runtime.ArtemisRuntimeConfig; @@ -74,15 +74,13 @@ void build(CombinedIndexBuildItem indexBuildItem, for (Class c : BUILTIN_LOADBALANCING_POLICIES) { reflectiveClass.produce(new ReflectiveClassBuildItem(false, false, c)); } - } @BuildStep - @Record(ExecutionTime.STATIC_INIT) - void load(ArtemisBuildConfig config, BuildProducer additionalBean, - BuildProducer feature) { + void load(BuildProducer additionalBean, BuildProducer feature, + Optional artemisJms) { - if (config.getProtocol() != ArtemisBuildConfig.Protocol.CORE) { + if (artemisJms.isPresent()) { return; } feature.produce(new FeatureBuildItem(FeatureBuildItem.ARTEMIS_CORE)); @@ -91,11 +89,12 @@ void load(ArtemisBuildConfig config, BuildProducer addi @Record(ExecutionTime.RUNTIME_INIT) @BuildStep - void configure(ArtemisBuildConfig buildConfig, ArtemisCoreTemplate template, ArtemisRuntimeConfig runtimeConfig, - BeanContainerBuildItem beanContainer) { + void configure(ArtemisCoreTemplate template, ArtemisRuntimeConfig runtimeConfig, + BeanContainerBuildItem beanContainer, Optional artemisJms) { - if (buildConfig.getProtocol() == ArtemisBuildConfig.Protocol.CORE) { - template.setConfig(runtimeConfig, beanContainer.getValue()); + if (artemisJms.isPresent()) { + return; } + template.setConfig(runtimeConfig, beanContainer.getValue()); } } diff --git a/extensions/artemis-core/deployment/src/main/java/io/quarkus/artemis/core/deployment/ArtemisJmsBuildItem.java b/extensions/artemis-core/deployment/src/main/java/io/quarkus/artemis/core/deployment/ArtemisJmsBuildItem.java new file mode 100644 index 0000000000000..71aaf27395ac9 --- /dev/null +++ b/extensions/artemis-core/deployment/src/main/java/io/quarkus/artemis/core/deployment/ArtemisJmsBuildItem.java @@ -0,0 +1,9 @@ +package io.quarkus.artemis.core.deployment; + +import io.quarkus.builder.item.SimpleBuildItem; + +/** + * Marker build item indicating that JMS is enabled + */ +public final class ArtemisJmsBuildItem extends SimpleBuildItem { +} diff --git a/extensions/artemis-core/runtime/src/main/java/io/quarkus/artemis/core/runtime/ArtemisBuildConfig.java b/extensions/artemis-core/runtime/src/main/java/io/quarkus/artemis/core/runtime/ArtemisBuildConfig.java deleted file mode 100644 index 836e9c5577599..0000000000000 --- a/extensions/artemis-core/runtime/src/main/java/io/quarkus/artemis/core/runtime/ArtemisBuildConfig.java +++ /dev/null @@ -1,35 +0,0 @@ -package io.quarkus.artemis.core.runtime; - -import java.util.Optional; - -import io.quarkus.runtime.annotations.ConfigItem; -import io.quarkus.runtime.annotations.ConfigPhase; -import io.quarkus.runtime.annotations.ConfigRoot; - -@ConfigRoot(name = "artemis", phase = ConfigPhase.BUILD_AND_RUN_TIME_FIXED) -public class ArtemisBuildConfig { - - public enum Protocol { - CORE, - JMS - } - - /** - * Artemis protocol, defaults to JMS if it is on classpath else to CORE - */ - @ConfigItem - public Optional protocol; - - public Protocol getProtocol() { - return protocol.orElseGet(ArtemisBuildConfig::getDefaultProtocol); - } - - public static Protocol getDefaultProtocol() { - try { - Class.forName("io.quarkus.artemis.jms.runtime.ArtemisJmsTemplate"); - return Protocol.JMS; - } catch (ClassNotFoundException e) { - return Protocol.CORE; - } - } -} diff --git a/extensions/artemis-jms/deployment/src/main/java/io/quarkus/artemis/jms/deployment/ArtemisJmsProcessor.java b/extensions/artemis-jms/deployment/src/main/java/io/quarkus/artemis/jms/deployment/ArtemisJmsProcessor.java index 533874c9bd2cf..cf77ea85e6e70 100644 --- a/extensions/artemis-jms/deployment/src/main/java/io/quarkus/artemis/jms/deployment/ArtemisJmsProcessor.java +++ b/extensions/artemis-jms/deployment/src/main/java/io/quarkus/artemis/jms/deployment/ArtemisJmsProcessor.java @@ -2,7 +2,7 @@ import io.quarkus.arc.deployment.AdditionalBeanBuildItem; import io.quarkus.arc.deployment.BeanContainerBuildItem; -import io.quarkus.artemis.core.runtime.ArtemisBuildConfig; +import io.quarkus.artemis.core.deployment.ArtemisJmsBuildItem; import io.quarkus.artemis.core.runtime.ArtemisRuntimeConfig; import io.quarkus.artemis.jms.runtime.ArtemisJmsProducer; import io.quarkus.artemis.jms.runtime.ArtemisJmsTemplate; @@ -15,24 +15,19 @@ public class ArtemisJmsProcessor { @BuildStep - @Record(ExecutionTime.STATIC_INIT) - void load(ArtemisBuildConfig config, BuildProducer additionalBean, - BuildProducer feature) { + void load(BuildProducer additionalBean, BuildProducer feature, + BuildProducer artemisJms) { - if (config.getProtocol() != ArtemisBuildConfig.Protocol.JMS) { - return; - } + artemisJms.produce(new ArtemisJmsBuildItem()); feature.produce(new FeatureBuildItem(FeatureBuildItem.ARTEMIS_JMS)); additionalBean.produce(AdditionalBeanBuildItem.unremovableOf(ArtemisJmsProducer.class)); } @Record(ExecutionTime.RUNTIME_INIT) @BuildStep - void configure(ArtemisBuildConfig buildConfig, ArtemisJmsTemplate template, ArtemisRuntimeConfig runtimeConfig, + void configure(ArtemisJmsTemplate template, ArtemisRuntimeConfig runtimeConfig, BeanContainerBuildItem beanContainer) { - if (buildConfig.getProtocol() == ArtemisBuildConfig.Protocol.JMS) { - template.setConfig(runtimeConfig, beanContainer.getValue()); - } + template.setConfig(runtimeConfig, beanContainer.getValue()); } } From d6d8eef011f6b44b937c1e516a02ae92d6b47fbc Mon Sep 17 00:00:00 2001 From: Jacob Middag Date: Tue, 25 Jun 2019 22:22:57 +0200 Subject: [PATCH 3/6] Produce JMS ConnectionFactory instead of specific ActiveMQ --- .../io/quarkus/artemis/jms/runtime/ArtemisJmsProducer.java | 3 ++- .../java/io/quarkus/it/artemis/ArtemisConsumerManager.java | 5 ++--- .../java/io/quarkus/it/artemis/ArtemisProducerManager.java | 5 ++--- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/extensions/artemis-jms/runtime/src/main/java/io/quarkus/artemis/jms/runtime/ArtemisJmsProducer.java b/extensions/artemis-jms/runtime/src/main/java/io/quarkus/artemis/jms/runtime/ArtemisJmsProducer.java index c23fe7bf354f9..a02a085871013 100644 --- a/extensions/artemis-jms/runtime/src/main/java/io/quarkus/artemis/jms/runtime/ArtemisJmsProducer.java +++ b/extensions/artemis-jms/runtime/src/main/java/io/quarkus/artemis/jms/runtime/ArtemisJmsProducer.java @@ -2,6 +2,7 @@ import javax.enterprise.context.ApplicationScoped; import javax.enterprise.inject.Produces; +import javax.jms.ConnectionFactory; import org.apache.activemq.artemis.jms.client.ActiveMQJMSConnectionFactory; @@ -13,7 +14,7 @@ public class ArtemisJmsProducer { private ArtemisRuntimeConfig config; @Produces - public ActiveMQJMSConnectionFactory producesConnectionFactory() { + public ConnectionFactory producesConnectionFactory() { return new ActiveMQJMSConnectionFactory(config.url, config.username.orElse(null), config.password.orElse(null)); } diff --git a/integration-tests/artemis-jms/src/main/java/io/quarkus/it/artemis/ArtemisConsumerManager.java b/integration-tests/artemis-jms/src/main/java/io/quarkus/it/artemis/ArtemisConsumerManager.java index 145f6b95b54a7..5452a493cd0a7 100644 --- a/integration-tests/artemis-jms/src/main/java/io/quarkus/it/artemis/ArtemisConsumerManager.java +++ b/integration-tests/artemis-jms/src/main/java/io/quarkus/it/artemis/ArtemisConsumerManager.java @@ -4,17 +4,16 @@ import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; import javax.jms.Connection; +import javax.jms.ConnectionFactory; import javax.jms.JMSException; import javax.jms.MessageConsumer; import javax.jms.Session; -import org.apache.activemq.artemis.jms.client.ActiveMQJMSConnectionFactory; - @ApplicationScoped public class ArtemisConsumerManager { @Inject - ActiveMQJMSConnectionFactory connectionFactory; + ConnectionFactory connectionFactory; private Connection connection; diff --git a/integration-tests/artemis-jms/src/main/java/io/quarkus/it/artemis/ArtemisProducerManager.java b/integration-tests/artemis-jms/src/main/java/io/quarkus/it/artemis/ArtemisProducerManager.java index 13f86da92f036..edd8016e1030c 100644 --- a/integration-tests/artemis-jms/src/main/java/io/quarkus/it/artemis/ArtemisProducerManager.java +++ b/integration-tests/artemis-jms/src/main/java/io/quarkus/it/artemis/ArtemisProducerManager.java @@ -4,17 +4,16 @@ import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; import javax.jms.Connection; +import javax.jms.ConnectionFactory; import javax.jms.JMSException; import javax.jms.MessageProducer; import javax.jms.Session; -import org.apache.activemq.artemis.jms.client.ActiveMQJMSConnectionFactory; - @ApplicationScoped public class ArtemisProducerManager { @Inject - ActiveMQJMSConnectionFactory connectionFactory; + ConnectionFactory connectionFactory; private Connection connection; From 9b61f8598441d9f7894ac57d8854585c9234b7c7 Mon Sep 17 00:00:00 2001 From: Jacob Middag Date: Fri, 19 Jul 2019 12:24:19 +0200 Subject: [PATCH 4/6] Use JniBuildItem to enable JNI --- .../io/quarkus/netty/deployment/NettyProcessor.java | 12 +++++++++++- integration-tests/artemis-core/pom.xml | 1 - integration-tests/artemis-jms/pom.xml | 1 - 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/extensions/netty/deployment/src/main/java/io/quarkus/netty/deployment/NettyProcessor.java b/extensions/netty/deployment/src/main/java/io/quarkus/netty/deployment/NettyProcessor.java index e52e86f557862..33946a8b60c1e 100644 --- a/extensions/netty/deployment/src/main/java/io/quarkus/netty/deployment/NettyProcessor.java +++ b/extensions/netty/deployment/src/main/java/io/quarkus/netty/deployment/NettyProcessor.java @@ -13,6 +13,7 @@ import io.quarkus.deployment.annotations.BuildStep; import io.quarkus.deployment.annotations.ExecutionTime; import io.quarkus.deployment.annotations.Record; +import io.quarkus.deployment.builditem.JniBuildItem; import io.quarkus.deployment.builditem.substrate.ReflectiveClassBuildItem; import io.quarkus.deployment.builditem.substrate.SubstrateConfigBuildItem; import io.quarkus.netty.BossGroup; @@ -26,7 +27,9 @@ class NettyProcessor { private static final Logger log = Logger.getLogger(NettyProcessor.class); @BuildStep - SubstrateConfigBuildItem build() { + SubstrateConfigBuildItem build(BuildProducer jni) { + boolean enableJni = false; + reflectiveClass.produce(new ReflectiveClassBuildItem(false, false, "io.netty.channel.socket.nio.NioSocketChannel")); reflectiveClass .produce(new ReflectiveClassBuildItem(false, false, "io.netty.channel.socket.nio.NioServerSocketChannel")); @@ -51,6 +54,7 @@ SubstrateConfigBuildItem build() { try { Class.forName("io.netty.channel.unix.UnixChannel"); + enableJni = true; builder.addRuntimeInitializedClass("io.netty.channel.unix.Errors") .addRuntimeInitializedClass("io.netty.channel.unix.FileDescriptor") .addRuntimeInitializedClass("io.netty.channel.unix.IovArray") @@ -62,6 +66,7 @@ SubstrateConfigBuildItem build() { try { Class.forName("io.netty.channel.epoll.EpollMode"); + enableJni = true; builder.addRuntimeInitializedClass("io.netty.channel.epoll.Epoll") .addRuntimeInitializedClass("io.netty.channel.epoll.EpollEventArray") .addRuntimeInitializedClass("io.netty.channel.epoll.EpollEventLoop") @@ -73,6 +78,7 @@ SubstrateConfigBuildItem build() { try { Class.forName("io.netty.channel.kqueue.AcceptFilter"); + enableJni = true; builder.addRuntimeInitializedClass("io.netty.channel.kqueue.KQueue") .addRuntimeInitializedClass("io.netty.channel.kqueue.KQueueEventArray") .addRuntimeInitializedClass("io.netty.channel.kqueue.KQueueEventLoop") @@ -82,6 +88,10 @@ SubstrateConfigBuildItem build() { log.debug("Not registering Netty native kqueue classes as they were not found"); } + if (enableJni) { + jni.produce(new JniBuildItem()); + } + return builder //TODO: make configurable .build(); } diff --git a/integration-tests/artemis-core/pom.xml b/integration-tests/artemis-core/pom.xml index 022f00a63eb91..9a204f4d6e7c4 100644 --- a/integration-tests/artemis-core/pom.xml +++ b/integration-tests/artemis-core/pom.xml @@ -110,7 +110,6 @@ true true - true