diff --git a/deployment/pom.xml b/deployment/pom.xml index 5e5ede5..f861349 100644 --- a/deployment/pom.xml +++ b/deployment/pom.xml @@ -52,6 +52,10 @@ io.quarkus quarkus-arc-deployment + + io.quarkus + quarkus-jms-spi-deployment + io.quarkus quarkus-netty-deployment diff --git a/deployment/src/main/java/org/amqphub/quarkus/qpid/jms/deployment/QpidJmsProcessor.java b/deployment/src/main/java/org/amqphub/quarkus/qpid/jms/deployment/QpidJmsProcessor.java index 52ec56b..eb8ccb4 100644 --- a/deployment/src/main/java/org/amqphub/quarkus/qpid/jms/deployment/QpidJmsProcessor.java +++ b/deployment/src/main/java/org/amqphub/quarkus/qpid/jms/deployment/QpidJmsProcessor.java @@ -15,6 +15,14 @@ */ package org.amqphub.quarkus.qpid.jms.deployment; +import io.quarkus.arc.deployment.SyntheticBeanBuildItem; +import io.quarkus.deployment.annotations.ExecutionTime; +import io.quarkus.deployment.annotations.Record; +import io.quarkus.jms.spi.deployment.ConnectionFactoryWrapperBuildItem; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.jms.ConnectionFactory; +import org.amqphub.quarkus.qpid.jms.QpidJmsRecorder; +import org.amqphub.quarkus.qpid.jms.runtime.ConnectionFactoryWrapper; import org.amqphub.quarkus.qpid.jms.runtime.QpidJmsProducer; import org.apache.qpid.jms.JmsConnectionFactory; import org.apache.qpid.jms.meta.JmsConnectionInfo; @@ -60,6 +68,9 @@ import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem; import io.quarkus.deployment.builditem.nativeimage.RuntimeInitializedClassBuildItem; +import java.util.Optional; +import java.util.function.Function; + public class QpidJmsProcessor { private static final String QPID_JMS = "qpid-jms"; @@ -80,6 +91,25 @@ public void enableSecurityServices(BuildProducer feature, AdditionalBeanBuildItem registerBean() { return AdditionalBeanBuildItem.unremovableOf(QpidJmsProducer.class); } + + @BuildStep + @Record(ExecutionTime.RUNTIME_INIT) + void connectionFactoryWrapper(Optional connectionFactoryWrapper, + QpidJmsRecorder recorder, + BuildProducer syntheticBeanProducer) { + Optional> wrapper = Optional.empty(); + if (connectionFactoryWrapper.isPresent()) { + wrapper = Optional.of(connectionFactoryWrapper.get().getWrapper()); + } + + SyntheticBeanBuildItem.ExtendedBeanConfigurator configurator = SyntheticBeanBuildItem.configure(ConnectionFactoryWrapper.class) + .setRuntimeInit() + .defaultBean() + .scope(ApplicationScoped.class) + .runtimeValue(recorder.getConnectionFactoryWrapper(wrapper)); + + syntheticBeanProducer.produce(configurator.done()); + } @BuildStep public void build(CombinedIndexBuildItem indexBuildItem, BuildProducer reflectiveClass, diff --git a/runtime/src/main/java/org/amqphub/quarkus/qpid/jms/QpidJmsRecorder.java b/runtime/src/main/java/org/amqphub/quarkus/qpid/jms/QpidJmsRecorder.java new file mode 100644 index 0000000..797feac --- /dev/null +++ b/runtime/src/main/java/org/amqphub/quarkus/qpid/jms/QpidJmsRecorder.java @@ -0,0 +1,22 @@ +package org.amqphub.quarkus.qpid.jms; + +import io.quarkus.runtime.RuntimeValue; +import io.quarkus.runtime.annotations.Recorder; +import jakarta.jms.ConnectionFactory; +import org.amqphub.quarkus.qpid.jms.runtime.ConnectionFactoryWrapper; + +import java.util.Optional; +import java.util.function.Function; + +@Recorder +public class QpidJmsRecorder { + public RuntimeValue getConnectionFactoryWrapper(Optional> wrapper) { + return new RuntimeValue<>(connectionFactory -> { + if (wrapper.isPresent()) { + return (ConnectionFactory) wrapper.get().apply(connectionFactory); + } else { + return connectionFactory; + } + }); + } +} diff --git a/runtime/src/main/java/org/amqphub/quarkus/qpid/jms/runtime/ConnectionFactoryWrapper.java b/runtime/src/main/java/org/amqphub/quarkus/qpid/jms/runtime/ConnectionFactoryWrapper.java new file mode 100644 index 0000000..b201d10 --- /dev/null +++ b/runtime/src/main/java/org/amqphub/quarkus/qpid/jms/runtime/ConnectionFactoryWrapper.java @@ -0,0 +1,7 @@ +package org.amqphub.quarkus.qpid.jms.runtime; + +import jakarta.jms.ConnectionFactory; + +public interface ConnectionFactoryWrapper { + ConnectionFactory wrap(ConnectionFactory connectionFactory); +} diff --git a/runtime/src/main/java/org/amqphub/quarkus/qpid/jms/runtime/QpidJmsProducer.java b/runtime/src/main/java/org/amqphub/quarkus/qpid/jms/runtime/QpidJmsProducer.java index 3231184..eefca2a 100644 --- a/runtime/src/main/java/org/amqphub/quarkus/qpid/jms/runtime/QpidJmsProducer.java +++ b/runtime/src/main/java/org/amqphub/quarkus/qpid/jms/runtime/QpidJmsProducer.java @@ -33,8 +33,8 @@ public class QpidJmsProducer { @Produces @ApplicationScoped @DefaultBean - public ConnectionFactory connectionFactory() { - return new JmsConnectionFactory(config.username.orElse(null), config.password.orElse(null), config.url); + public ConnectionFactory connectionFactory(ConnectionFactoryWrapper wrapper) { + return wrapper.wrap(new JmsConnectionFactory(config.username.orElse(null), config.password.orElse(null), config.url)); } public QpidJmsRuntimeConfig getConfig() {