This is an automated email from the ASF dual-hosted git repository. acosentino pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel.git
commit b6d5a81f437e07fd1d94bf93ba928cc877f00468 Author: Luca Burgazzoli <[email protected]> AuthorDate: Fri Oct 2 17:11:27 2020 +0200 CAMEL-15607: camel-core - When resolving language then only resolve via registry once (#4348) --- .../camel/impl/engine/AbstractCamelContext.java | 73 +++++++++------------- 1 file changed, 28 insertions(+), 45 deletions(-) diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java index 93c92b5..3387765 100644 --- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java +++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java @@ -1636,60 +1636,43 @@ public abstract class AbstractCamelContext extends BaseService } @Override - public Language resolveLanguage(String language) { - LOG.debug("Resolving language: {}", language); - - Language answer; - synchronized (languages) { - // as first iteration, check if there is a language instance for the given name - // bound to the registry - answer = ResolverHelper.lookupLanguageInRegistryWithFallback(getCamelContextReference(), language); - if (answer != null) { - Language old = languages.put(language, answer); - // if the language has already been loaded, thus it is already registered - // in the local language cache, we can return it as it has already been - // initialized and configured - if (old == answer) { - return answer; - } - } else { - answer = languages.get(language); + public Language resolveLanguage(String name) { + LOG.debug("Resolving language: {}", name); - // check if the language is singleton, if so return the shared - // instance - if (IsSingleton.test(answer)) { - return answer; - } else { - answer = null; - } - } + return languages.computeIfAbsent(name, new Function<String, Language>() { + @Override + public Language apply(String s) { + final CamelContext camelContext = getCamelContextReference(); - if (answer == null) { - // language not known or not singleton, then use resolver - answer = getLanguageResolver().resolveLanguage(language, getCamelContextReference()); - } + // as first iteration, check if there is a language instance for the given name + // bound to the registry + Language language = ResolverHelper.lookupLanguageInRegistryWithFallback(camelContext, name); - if (answer != null) { - // inject CamelContext if aware - CamelContextAware.trySetCamelContext(answer, getCamelContextReference()); + if (language == null) { + // language not known, then use resolver + language = getLanguageResolver().resolveLanguage(name, camelContext); + } - if (answer instanceof Service) { - try { - startService((Service) answer); - } catch (Exception e) { - throw RuntimeCamelException.wrapRuntimeCamelException(e); + if (language != null) { + if (language instanceof Service) { + try { + startService((Service) language); + } catch (Exception e) { + throw RuntimeCamelException.wrapRuntimeCamelException(e); + } } - } - for (LifecycleStrategy strategy : lifecycleStrategies) { - strategy.onLanguageCreated(language, answer); + // inject CamelContext if aware + CamelContextAware.trySetCamelContext(language, camelContext); + + for (LifecycleStrategy strategy : lifecycleStrategies) { + strategy.onLanguageCreated(name, language); + } } - languages.put(language, answer); + return language; } - } - - return answer; + }); } // Properties
