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

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

commit a747dbb9a9cd5a5e91dc6926f2cbdfd73b8b5e56
Author: Otavio Rodolfo Piske <[email protected]>
AuthorDate: Mon Aug 12 17:42:14 2024 +0200

    CAMEL-21075: avoid keeping multiple consumer instances cached
    
    - This should ensure the cache is cleared when stopping the component
    - Also should avoid caching duplicated entries
---
 .../langchain4j/chat/LangChain4jChatEndpoint.java  |  7 ++++++
 .../langchain4j/chat/LangChain4jChatProducer.java  | 10 +++++---
 .../chat/tool/CamelToolExecutorCache.java          | 21 ++++++++--------
 .../chat/tool/CamelToolSpecification.java          | 28 ++++++++++++++++++++++
 4 files changed, 52 insertions(+), 14 deletions(-)

diff --git 
a/components/camel-ai/camel-langchain4j-chat/src/main/java/org/apache/camel/component/langchain4j/chat/LangChain4jChatEndpoint.java
 
b/components/camel-ai/camel-langchain4j-chat/src/main/java/org/apache/camel/component/langchain4j/chat/LangChain4jChatEndpoint.java
index 9bb786648b4..e439daa7025 100644
--- 
a/components/camel-ai/camel-langchain4j-chat/src/main/java/org/apache/camel/component/langchain4j/chat/LangChain4jChatEndpoint.java
+++ 
b/components/camel-ai/camel-langchain4j-chat/src/main/java/org/apache/camel/component/langchain4j/chat/LangChain4jChatEndpoint.java
@@ -142,4 +142,11 @@ public class LangChain4jChatEndpoint extends 
DefaultEndpoint {
     public void setCamelToolParameter(CamelSimpleToolParameter 
camelToolParameter) {
         this.camelToolParameter = camelToolParameter;
     }
+
+    @Override
+    protected void doStop() throws Exception {
+        super.doStop();
+
+        CamelToolExecutorCache.getInstance().getTools().clear();
+    }
 }
diff --git 
a/components/camel-ai/camel-langchain4j-chat/src/main/java/org/apache/camel/component/langchain4j/chat/LangChain4jChatProducer.java
 
b/components/camel-ai/camel-langchain4j-chat/src/main/java/org/apache/camel/component/langchain4j/chat/LangChain4jChatProducer.java
index 153eb6f4cf6..b7cc1c7d581 100644
--- 
a/components/camel-ai/camel-langchain4j-chat/src/main/java/org/apache/camel/component/langchain4j/chat/LangChain4jChatProducer.java
+++ 
b/components/camel-ai/camel-langchain4j-chat/src/main/java/org/apache/camel/component/langchain4j/chat/LangChain4jChatProducer.java
@@ -18,6 +18,7 @@ package org.apache.camel.component.langchain4j.chat;
 
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 import com.fasterxml.jackson.databind.JsonNode;
@@ -170,9 +171,12 @@ public class LangChain4jChatProducer extends 
DefaultProducer {
 
         }
 
-        if 
(CamelToolExecutorCache.getInstance().getTools().containsKey(langChain4jChatEndpoint.getChatId()))
 {
-            List<ToolSpecification> toolSpecifications = 
CamelToolExecutorCache.getInstance().getTools()
-                    .get(langChain4jChatEndpoint.getChatId()).stream()
+        final Map<String, Set<CamelToolSpecification>> tools = 
CamelToolExecutorCache.getInstance().getTools();
+        if (tools.containsKey(langChain4jChatEndpoint.getChatId())) {
+            final Set<CamelToolSpecification> camelToolSpecificationSet = tools
+                    .get(langChain4jChatEndpoint.getChatId());
+
+            final List<ToolSpecification> toolSpecifications = 
camelToolSpecificationSet.stream()
                     .map(camelToolSpecification -> 
camelToolSpecification.getToolSpecification())
                     .collect(Collectors.toList());
 
diff --git 
a/components/camel-ai/camel-langchain4j-chat/src/main/java/org/apache/camel/component/langchain4j/chat/tool/CamelToolExecutorCache.java
 
b/components/camel-ai/camel-langchain4j-chat/src/main/java/org/apache/camel/component/langchain4j/chat/tool/CamelToolExecutorCache.java
index 20c139cb5d2..0107b4fc08a 100644
--- 
a/components/camel-ai/camel-langchain4j-chat/src/main/java/org/apache/camel/component/langchain4j/chat/tool/CamelToolExecutorCache.java
+++ 
b/components/camel-ai/camel-langchain4j-chat/src/main/java/org/apache/camel/component/langchain4j/chat/tool/CamelToolExecutorCache.java
@@ -16,9 +16,9 @@
  */
 package org.apache.camel.component.langchain4j.chat.tool;
 
-import java.util.ArrayList;
-import java.util.List;
+import java.util.LinkedHashSet;
 import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 
 /**
@@ -27,32 +27,31 @@ import java.util.concurrent.ConcurrentHashMap;
  */
 public final class CamelToolExecutorCache {
 
-    private static CamelToolExecutorCache INSTANCE;
-    private Map<String, List<CamelToolSpecification>> tools;
+    private Map<String, Set<CamelToolSpecification>> tools;
 
     private CamelToolExecutorCache() {
         tools = new ConcurrentHashMap<>();
     }
 
-    public synchronized static CamelToolExecutorCache getInstance() {
-        if (INSTANCE == null) {
-            INSTANCE = new CamelToolExecutorCache();
-        }
+    private static final class SingletonHolder {
+        private static final CamelToolExecutorCache INSTANCE = new 
CamelToolExecutorCache();
+    }
 
-        return INSTANCE;
+    public static CamelToolExecutorCache getInstance() {
+        return SingletonHolder.INSTANCE;
     }
 
     public void put(String chatId, CamelToolSpecification specification) {
         if (tools.get(chatId) != null) {
             tools.get(chatId).add(specification);
         } else {
-            List<CamelToolSpecification> camelToolSpecifications = new 
ArrayList<>();
+            Set<CamelToolSpecification> camelToolSpecifications = new 
LinkedHashSet<>();
             camelToolSpecifications.add(specification);
             tools.put(chatId, camelToolSpecifications);
         }
     }
 
-    public Map<String, List<CamelToolSpecification>> getTools() {
+    public Map<String, Set<CamelToolSpecification>> getTools() {
         return tools;
     }
 
diff --git 
a/components/camel-ai/camel-langchain4j-chat/src/main/java/org/apache/camel/component/langchain4j/chat/tool/CamelToolSpecification.java
 
b/components/camel-ai/camel-langchain4j-chat/src/main/java/org/apache/camel/component/langchain4j/chat/tool/CamelToolSpecification.java
index 9b2d402916d..17409077998 100644
--- 
a/components/camel-ai/camel-langchain4j-chat/src/main/java/org/apache/camel/component/langchain4j/chat/tool/CamelToolSpecification.java
+++ 
b/components/camel-ai/camel-langchain4j-chat/src/main/java/org/apache/camel/component/langchain4j/chat/tool/CamelToolSpecification.java
@@ -16,6 +16,8 @@
  */
 package org.apache.camel.component.langchain4j.chat.tool;
 
+import java.util.Objects;
+
 import dev.langchain4j.agent.tool.ToolSpecification;
 import org.apache.camel.component.langchain4j.chat.LangChain4jChatConsumer;
 
@@ -48,4 +50,30 @@ public class CamelToolSpecification {
     public void setConsumer(LangChain4jChatConsumer consumer) {
         this.consumer = consumer;
     }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        CamelToolSpecification that = (CamelToolSpecification) o;
+        return Objects.equals(toolSpecification, that.toolSpecification) && 
Objects.equals(consumer,
+                that.consumer);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(toolSpecification, consumer);
+    }
+
+    @Override
+    public String toString() {
+        return "CamelToolSpecification{" +
+               "toolSpecification=" + toolSpecification +
+               ", consumer=" + consumer +
+               '}';
+    }
 }

Reply via email to