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 + + '}'; + } }
