You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by or...@apache.org on 2024/08/13 06:13:30 UTC
(camel) 01/02: CAMEL-21075: avoid keeping multiple consumer instances cached
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 <an...@gmail.com>
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 +
+ '}';
+ }
}