This is an automated email from the ASF dual-hosted git repository. ggrzybek pushed a commit to branch CAMEL-15061-3.4.x in repository https://gitbox.apache.org/repos/asf/camel-karaf.git
commit f0f5863d0029ef0f9b893075982fa1fa8e692132 Author: Grzegorz Grzybek <gr.grzy...@gmail.com> AuthorDate: Thu May 14 14:50:19 2020 +0200 [CAMEL-15061] Cache failed attempts to load classes to greatly improve performance --- .../blueprint/BlueprintContainerBeanRepository.java | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintContainerBeanRepository.java b/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintContainerBeanRepository.java index 8c32a62..2028f4f 100644 --- a/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintContainerBeanRepository.java +++ b/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintContainerBeanRepository.java @@ -16,10 +16,12 @@ */ package org.apache.camel.blueprint; +import java.util.Collection; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; import org.apache.camel.NoSuchBeanException; import org.apache.camel.spi.BeanRepository; @@ -34,6 +36,8 @@ public class BlueprintContainerBeanRepository implements BeanRepository { private final BlueprintContainer blueprintContainer; + private final Map<Class<?>, Map<String, Class<?>>> perBlueprintContainerCache = new ConcurrentHashMap<>(); + public BlueprintContainerBeanRepository(BlueprintContainer blueprintContainer) { this.blueprintContainer = blueprintContainer; } @@ -71,13 +75,24 @@ public class BlueprintContainerBeanRepository implements BeanRepository { } @Override + @SuppressWarnings("unchecked") public <T> Map<String, T> findByTypeWithName(Class<T> type) { - return lookupByType(blueprintContainer, type); + if (perBlueprintContainerCache.containsKey(type)) { + return (Map<String, T>) perBlueprintContainerCache.get(type); + } + Map<String, T> result = lookupByType(blueprintContainer, type); + perBlueprintContainerCache.put(type, (Map<String, Class<?>>) result); + return result; } @Override + @SuppressWarnings("unchecked") public <T> Set<T> findByType(Class<T> type) { + if (perBlueprintContainerCache.containsKey(type)) { + return new HashSet<T>((Collection<? extends T>) perBlueprintContainerCache.get(type).values()); + } Map<String, T> map = lookupByType(blueprintContainer, type); + perBlueprintContainerCache.put(type, (Map<String, Class<?>>) map); return new HashSet<>(map.values()); }