You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ja...@apache.org on 2023/05/04 10:40:24 UTC

[camel-quarkus] 01/01: Add workaround for RemoteCacheManager bean discovery #4841

This is an automated email from the ASF dual-hosted git repository.

jamesnetherton pushed a commit to branch quarkus-main
in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git

commit b1937f9c3e9d299e000f9b7c1332b68ec8093d28
Author: James Netherton <ja...@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();