This is an automated email from the ASF dual-hosted git repository. github-bot pushed a commit to branch quarkus-main in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git
commit 44ced31a740f275bd7508e87347f341012e05311 Author: James Netherton <jamesnether...@gmail.com> AuthorDate: Thu Apr 27 11:03:48 2023 +0100 Add workaround for RemoteCacheManager bean discovery #4841 --- .../pages/reference/extensions/infinispan.adoc | 23 +++++++++++++ .../camel/quarkus/core/RuntimeBeanRepository.java | 8 +++++ .../runtime/src/main/doc/configuration.adoc | 23 +++++++++++++ .../infinispan/CamelInfinispanRecorder.java | 39 ++++++++++++++++++++++ .../infinispan/InfinispanQuarkusClientRoutes.java | 7 ++++ 5 files changed, 100 insertions(+) diff --git a/docs/modules/ROOT/pages/reference/extensions/infinispan.adoc b/docs/modules/ROOT/pages/reference/extensions/infinispan.adoc index 20cfea3021..15eeabc4a4 100644 --- a/docs/modules/ROOT/pages/reference/extensions/infinispan.adoc +++ b/docs/modules/ROOT/pages/reference/extensions/infinispan.adoc @@ -54,6 +54,29 @@ endif::[] You can either configure the Infinispan client via the relevant Camel Infinispan component & endpoint options, or you may use the https://quarkus.io/guides/infinispan-client#configuration-reference[Quarkus Infinispan extension configuration properties]. +Note that if you choose to use Quarkus Infinispan configuration properties, you *must* add an injection point for the `RemoteCacheManager` in order for it to be discoverable by the Camel Infinispan component. For example: + +[source,java] +---- +public class Routes extends RouteBuilder { + // Injects the default unnamed RemoteCacheManager + @Inject + RemoteCacheManager cacheManager; + + // If configured, injects an optional named RemoteCacheManager + @Inject + @InfinispanClientName("myNamedClient") + RemoteCacheManager namedCacheManager; + + @Override + public void configure() { + // Route configuration here... + } +} + +---- + + [id="extensions-infinispan-configuration-camel-infinispan-infinispanremoteaggregationrepository-in-native-mode"] === Camel Infinispan `InfinispanRemoteAggregationRepository` in native mode diff --git a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/RuntimeBeanRepository.java b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/RuntimeBeanRepository.java index cd01044e1b..cfb34569f3 100644 --- a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/RuntimeBeanRepository.java +++ b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/RuntimeBeanRepository.java @@ -28,6 +28,7 @@ import io.quarkus.arc.Arc; import io.quarkus.arc.ArcContainer; import io.smallrye.common.annotation.Identifier; import jakarta.enterprise.inject.AmbiguousResolutionException; +import jakarta.enterprise.inject.literal.NamedLiteral; import jakarta.enterprise.inject.spi.Bean; import jakarta.enterprise.inject.spi.BeanManager; import org.apache.camel.spi.BeanRepository; @@ -73,10 +74,17 @@ public final class RuntimeBeanRepository implements BeanRepository { private static <T> Optional<T> getReferenceByName(BeanManager manager, String name, Class<T> type) { Set<Bean<?>> beans = manager.getBeans(name); + + if (beans.isEmpty()) { + // Fallback to searching explicitly with NamedLiteral + beans = manager.getBeans(type, NamedLiteral.of(name)); + } + if (beans.isEmpty()) { // Fallback to SmallRye @Identifier beans = manager.getBeans(type, Identifier.Literal.of(name)); } + return Optional.ofNullable(manager.resolve(beans)).map(bean -> getReference(manager, type, bean)); } diff --git a/extensions/infinispan/runtime/src/main/doc/configuration.adoc b/extensions/infinispan/runtime/src/main/doc/configuration.adoc index f4bd4fac58..cdc779e832 100644 --- a/extensions/infinispan/runtime/src/main/doc/configuration.adoc +++ b/extensions/infinispan/runtime/src/main/doc/configuration.adoc @@ -3,6 +3,29 @@ You can either configure the Infinispan client via the relevant Camel Infinispan component & endpoint options, or you may use the https://quarkus.io/guides/infinispan-client#configuration-reference[Quarkus Infinispan extension configuration properties]. +Note that if you choose to use Quarkus Infinispan configuration properties, you *must* add an injection point for the `RemoteCacheManager` in order for it to be discoverable by the Camel Infinispan component. For example: + +[source,java] +---- +public class Routes extends RouteBuilder { + // Injects the default unnamed RemoteCacheManager + @Inject + RemoteCacheManager cacheManager; + + // If configured, injects an optional named RemoteCacheManager + @Inject + @InfinispanClientName("myNamedClient") + RemoteCacheManager namedCacheManager; + + @Override + public void configure() { + // Route configuration here... + } +} + +---- + + === Camel Infinispan `InfinispanRemoteAggregationRepository` in native mode If you chose to use the `InfinispanRemoteAggregationRepository` in native mode, then you must xref:extensions/core.adoc#quarkus.camel.native.reflection.serialization-enabled[enable native serialization support]. diff --git a/extensions/infinispan/runtime/src/main/java/org/apache/camel/quarkus/component/infinispan/CamelInfinispanRecorder.java b/extensions/infinispan/runtime/src/main/java/org/apache/camel/quarkus/component/infinispan/CamelInfinispanRecorder.java new file mode 100644 index 0000000000..9a53283e1b --- /dev/null +++ b/extensions/infinispan/runtime/src/main/java/org/apache/camel/quarkus/component/infinispan/CamelInfinispanRecorder.java @@ -0,0 +1,39 @@ +package org.apache.camel.quarkus.component.infinispan; + +import java.lang.annotation.Annotation; + +import io.quarkus.infinispan.client.InfinispanClientName; +import io.quarkus.infinispan.client.runtime.InfinispanClientUtil; +import io.quarkus.runtime.RuntimeValue; +import io.quarkus.runtime.annotations.Recorder; +import jakarta.enterprise.inject.Default; +import jakarta.enterprise.inject.literal.NamedLiteral; +import org.apache.camel.quarkus.core.CamelBeanQualifierResolver; + +@Recorder +public class CamelInfinispanRecorder { + + public RuntimeValue<CamelBeanQualifierResolver> createInfinispanClientNameQualifierResolver(String clientName) { + CamelBeanQualifierResolver resolver = new CamelBeanQualifierResolver() { + Annotation[] annotations; + + @Override + public Annotation[] resolveQualifiers() { + if (clientName.startsWith(InfinispanClientUtil.DEFAULT_INFINISPAN_CLIENT_NAME)) { + annotations = new Annotation[] { Default.Literal.INSTANCE }; + } else { + annotations = new Annotation[] { NamedLiteral.of(clientName), InfinispanClientName.Literal.of(clientName) }; + } + + System.out.println(annotations); + + return annotations; + } + }; + return new RuntimeValue<>(resolver); + } + + public RuntimeValue<?> createBean() { + return new RuntimeValue<>(new Object()); + } +} diff --git a/integration-tests/infinispan-quarkus-client/src/main/java/org/apache/camel/quarkus/component/infinispan/InfinispanQuarkusClientRoutes.java b/integration-tests/infinispan-quarkus-client/src/main/java/org/apache/camel/quarkus/component/infinispan/InfinispanQuarkusClientRoutes.java index 7f4c291606..4baa067bf7 100644 --- a/integration-tests/infinispan-quarkus-client/src/main/java/org/apache/camel/quarkus/component/infinispan/InfinispanQuarkusClientRoutes.java +++ b/integration-tests/infinispan-quarkus-client/src/main/java/org/apache/camel/quarkus/component/infinispan/InfinispanQuarkusClientRoutes.java @@ -18,6 +18,8 @@ package org.apache.camel.quarkus.component.infinispan; import java.util.Set; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; import org.apache.camel.CamelContext; import org.apache.camel.component.infinispan.remote.InfinispanRemoteComponent; import org.apache.camel.component.infinispan.remote.InfinispanRemoteConfiguration; @@ -29,8 +31,13 @@ import org.infinispan.client.hotrod.configuration.Configuration; import org.infinispan.client.hotrod.configuration.ConfigurationBuilder; import org.infinispan.commons.marshall.ProtoStreamMarshaller; +@ApplicationScoped public class InfinispanQuarkusClientRoutes extends InfinispanCommonRoutes { + // TODO: This should not be required: https://github.com/apache/camel-quarkus/issues/4841 + @Inject + RemoteCacheManager cacheManager; + @Override protected Configuration getConfigurationBuilder() { Config config = ConfigProvider.getConfig();