This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/master by this push: new 9b0c798 camel-core - Optimize log to reuse default exchange formatter 9b0c798 is described below commit 9b0c79840d0611f42b95bbb08c82c742a09c11a2 Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Mon Nov 9 11:49:41 2020 +0100 camel-core - Optimize log to reuse default exchange formatter --- .../apache/camel/component/log/LogComponent.java | 20 +++++++ .../apache/camel/component/log/LogEndpoint.java | 68 +++++++++++++--------- .../component/log/CustomExchangeFormatterTest.java | 4 +- .../org/apache/camel/ExtendedCamelContext.java | 2 +- .../camel/impl/engine/AbstractCamelContext.java | 5 +- .../org/apache/camel/processor/LogProcessor.java | 2 +- .../core/xml/AbstractCamelContextFactoryBean.java | 2 +- .../camel/component/log/LogEndpointTest.java | 2 + .../camel/main/DefaultConfigurationConfigurer.java | 15 +++-- 9 files changed, 83 insertions(+), 37 deletions(-) diff --git a/components/camel-log/src/main/java/org/apache/camel/component/log/LogComponent.java b/components/camel-log/src/main/java/org/apache/camel/component/log/LogComponent.java index 2b48e1f..e46184b 100644 --- a/components/camel-log/src/main/java/org/apache/camel/component/log/LogComponent.java +++ b/components/camel-log/src/main/java/org/apache/camel/component/log/LogComponent.java @@ -38,6 +38,8 @@ public class LogComponent extends DefaultComponent { private static final Logger LOG = LoggerFactory.getLogger(LogComponent.class); + private ExchangeFormatter defaultExchangeFormatter; + @Metadata(label = "advanced") private ExchangeFormatter exchangeFormatter; @@ -116,4 +118,22 @@ public class LogComponent extends DefaultComponent { this.exchangeFormatter = exchangeFormatter; } + /** + * Gets the default shared exchange formatter. + */ + public ExchangeFormatter getDefaultExchangeFormatter() { + return defaultExchangeFormatter; + } + + @Override + protected void doInit() throws Exception { + DefaultExchangeFormatter def = new DefaultExchangeFormatter(); + def.setShowExchangePattern(true); + def.setSkipBodyLineSeparator(true); + def.setShowBody(true); + def.setShowBodyType(true); + def.setStyle(DefaultExchangeFormatter.OutputStyle.Default); + def.setMaxChars(10000); + this.defaultExchangeFormatter = def; + } } diff --git a/components/camel-log/src/main/java/org/apache/camel/component/log/LogEndpoint.java b/components/camel-log/src/main/java/org/apache/camel/component/log/LogEndpoint.java index 8345eb2..5b26785 100644 --- a/components/camel-log/src/main/java/org/apache/camel/component/log/LogEndpoint.java +++ b/components/camel-log/src/main/java/org/apache/camel/component/log/LogEndpoint.java @@ -132,27 +132,44 @@ public class LogEndpoint extends ProcessorEndpoint { protected void doInit() throws Exception { super.doInit(); + // ensure component is injected + if (getComponent() == null) { + setComponent(getCamelContext().getComponent("log")); + } + this.localFormatter = exchangeFormatter; if (this.localFormatter == null) { - DefaultExchangeFormatter def = new DefaultExchangeFormatter(); - def.setShowAll(showAll); - def.setShowBody(showBody); - def.setShowBodyType(showBodyType); - def.setShowCaughtException(showCaughtException); - def.setShowException(showException); - def.setShowExchangeId(showExchangeId); - def.setShowExchangePattern(showExchangePattern); - def.setShowFiles(showFiles); - def.setShowFuture(showFuture); - def.setShowHeaders(showHeaders); - def.setShowProperties(showProperties); - def.setShowStackTrace(showStackTrace); - def.setShowStreams(showStreams); - def.setMaxChars(maxChars); - def.setMultiline(multiline); - def.setSkipBodyLineSeparator(skipBodyLineSeparator); - def.setStyle(style); - this.localFormatter = def; + + // are any options configured if not we can optimize to use shared default + boolean changed = !showExchangePattern || !skipBodyLineSeparator || !showBody || !showBodyType || maxChars != 10000 + || style != DefaultExchangeFormatter.OutputStyle.Default; + changed |= showExchangeId || showProperties || showHeaders || showException || showCaughtException + || showStackTrace; + changed |= showAll || multiline || showFuture || showStreams || showFiles; + + if (changed) { + DefaultExchangeFormatter def = new DefaultExchangeFormatter(); + def.setShowAll(showAll); + def.setShowBody(showBody); + def.setShowBodyType(showBodyType); + def.setShowCaughtException(showCaughtException); + def.setShowException(showException); + def.setShowExchangeId(showExchangeId); + def.setShowExchangePattern(showExchangePattern); + def.setShowFiles(showFiles); + def.setShowFuture(showFuture); + def.setShowHeaders(showHeaders); + def.setShowProperties(showProperties); + def.setShowStackTrace(showStackTrace); + def.setShowStreams(showStreams); + def.setMaxChars(maxChars); + def.setMultiline(multiline); + def.setSkipBodyLineSeparator(skipBodyLineSeparator); + def.setStyle(style); + this.localFormatter = def; + } else { + this.localFormatter = getComponent().getDefaultExchangeFormatter(); + } } } @@ -194,6 +211,11 @@ public class LogEndpoint extends ProcessorEndpoint { return "log:" + logger.toString(); } + @Override + public LogComponent getComponent() { + return (LogComponent) super.getComponent(); + } + /** * Creates the logger {@link Processor} to be used. */ @@ -328,14 +350,6 @@ public class LogEndpoint extends ProcessorEndpoint { this.groupDelay = groupDelay; } - public ExchangeFormatter getLocalFormatter() { - return localFormatter; - } - - public void setLocalFormatter(ExchangeFormatter localFormatter) { - this.localFormatter = localFormatter; - } - public Logger getProvidedLogger() { return providedLogger; } diff --git a/components/camel-spring/src/test/java/org/apache/camel/component/log/CustomExchangeFormatterTest.java b/components/camel-spring/src/test/java/org/apache/camel/component/log/CustomExchangeFormatterTest.java index 46d7903..72541ab 100644 --- a/components/camel-spring/src/test/java/org/apache/camel/component/log/CustomExchangeFormatterTest.java +++ b/components/camel-spring/src/test/java/org/apache/camel/component/log/CustomExchangeFormatterTest.java @@ -37,8 +37,8 @@ public class CustomExchangeFormatterTest extends SpringTestSupport { continue; } LogEndpoint log = (LogEndpoint) ep; - aaa = "aaa".equals(log.getLoggerName()) ? (TestExchangeFormatter) log.getLocalFormatter() : aaa; - bbb = "bbb".equals(log.getLoggerName()) ? (TestExchangeFormatter) log.getLocalFormatter() : bbb; + aaa = "aaa".equals(log.getLoggerName()) ? (TestExchangeFormatter) log.getExchangeFormatter() : aaa; + bbb = "bbb".equals(log.getLoggerName()) ? (TestExchangeFormatter) log.getExchangeFormatter() : bbb; } assertNotNull(aaa); diff --git a/core/camel-api/src/main/java/org/apache/camel/ExtendedCamelContext.java b/core/camel-api/src/main/java/org/apache/camel/ExtendedCamelContext.java index a58e914..bcbb4e4 100644 --- a/core/camel-api/src/main/java/org/apache/camel/ExtendedCamelContext.java +++ b/core/camel-api/src/main/java/org/apache/camel/ExtendedCamelContext.java @@ -521,7 +521,7 @@ public interface ExtendedCamelContext extends CamelContext { void setupManagement(Map<String, Object> options); /** - * Gets a list of {@link LogListener}. + * Gets a list of {@link LogListener} (can be null if empty). */ Set<LogListener> getLogListeners(); diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java index eb0a465..e3396a0 100644 --- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java +++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java @@ -210,7 +210,7 @@ public abstract class AbstractCamelContext extends BaseService private final List<RouteStartupOrder> routeStartupOrder = new ArrayList<>(); private final StopWatch stopWatch = new StopWatch(false); private final Map<Class<?>, Object> extensions = new ConcurrentHashMap<>(); - private final Set<LogListener> logListeners = new LinkedHashSet<>(); + private Set<LogListener> logListeners; private final ThreadLocal<Set<String>> componentsInCreation = new ThreadLocal<Set<String>>() { @Override public Set<String> initialValue() { @@ -2013,6 +2013,9 @@ public abstract class AbstractCamelContext extends BaseService @Override public void addLogListener(LogListener listener) { + if (logListeners == null) { + logListeners = new LinkedHashSet<>(); + } logListeners.add(listener); } diff --git a/core/camel-core-processor/src/main/java/org/apache/camel/processor/LogProcessor.java b/core/camel-core-processor/src/main/java/org/apache/camel/processor/LogProcessor.java index 2729316..685b684 100644 --- a/core/camel-core-processor/src/main/java/org/apache/camel/processor/LogProcessor.java +++ b/core/camel-core-processor/src/main/java/org/apache/camel/processor/LogProcessor.java @@ -76,7 +76,7 @@ public class LogProcessor extends AsyncProcessorSupport implements Traceable, Id if (formatter != null) { msg = formatter.format(msg); } - if (!listeners.isEmpty()) { + if (listeners != null && !listeners.isEmpty()) { msg = fireListeners(exchange, msg); } logger.doLog(msg); diff --git a/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java b/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java index 39a96ea..14cfbb7 100644 --- a/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java +++ b/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java @@ -409,7 +409,7 @@ public abstract class AbstractCamelContextFactoryBean<T extends ModelCamelContex if (logListeners != null && !logListeners.isEmpty()) { for (Map.Entry<String, LogListener> entry : logListeners.entrySet()) { LogListener logListener = entry.getValue(); - if (!getContext().adapt(ExtendedCamelContext.class).getLogListeners().contains(logListener)) { + if (getContext().adapt(ExtendedCamelContext.class).getLogListeners() == null || !getContext().adapt(ExtendedCamelContext.class).getLogListeners().contains(logListener)) { LOG.info("Using custom LogListener with id: {} and implementation: {}", entry.getKey(), logListener); getContext().adapt(ExtendedCamelContext.class).addLogListener(logListener); } diff --git a/core/camel-core/src/test/java/org/apache/camel/component/log/LogEndpointTest.java b/core/camel-core/src/test/java/org/apache/camel/component/log/LogEndpointTest.java index 801e70b..56a16bf 100644 --- a/core/camel-core/src/test/java/org/apache/camel/component/log/LogEndpointTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/component/log/LogEndpointTest.java @@ -118,6 +118,7 @@ public class LogEndpointTest extends ContextTestSupport { @Override public void configure() throws Exception { LogEndpoint end = new LogEndpoint(); + end.setComponent(context.getComponent("log")); end.setCamelContext(context); end.setLogger(new MyLogger()); @@ -125,6 +126,7 @@ public class LogEndpointTest extends ContextTestSupport { endpoint.setLoggerName("loggerSetter"); endpoint.setGroupSize(10); endpoint.setCamelContext(context); + endpoint.setComponent(context.getComponent("log")); endpoint.start(); assertEquals("log:myLogger", end.getEndpointUri()); diff --git a/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationConfigurer.java b/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationConfigurer.java index a35bded..d405ae7 100644 --- a/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationConfigurer.java +++ b/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationConfigurer.java @@ -355,15 +355,22 @@ public final class DefaultConfigurationConfigurer { final Predicate<LifecycleStrategy> containsLifecycleStrategy = camelContext.getLifecycleStrategies()::contains; registerPropertiesForBeanTypesWithCondition(registry, LifecycleStrategy.class, containsLifecycleStrategy.negate(), camelContext::addLifecycleStrategy); - final Predicate<LogListener> containsLogListener - = camelContext.adapt(ExtendedCamelContext.class).getLogListeners()::contains; - registerPropertiesForBeanTypesWithCondition(registry, LogListener.class, containsLogListener.negate(), - camelContext.adapt(ExtendedCamelContext.class)::addLogListener); ModelCamelContext mcc = camelContext.adapt(ModelCamelContext.class); final Predicate<ModelLifecycleStrategy> containsModelLifecycleStrategy = mcc.getModelLifecycleStrategies()::contains; registerPropertiesForBeanTypesWithCondition(registry, ModelLifecycleStrategy.class, containsModelLifecycleStrategy.negate(), mcc::addModelLifecycleStrategy); + // log listeners + Map<String, LogListener> logListeners = registry.findByTypeWithName(LogListener.class); + if (logListeners != null && !logListeners.isEmpty()) { + for (LogListener logListener : logListeners.values()) { + boolean contains = ecc.getLogListeners() != null && ecc.getLogListeners().contains(logListener); + if (!contains) { + ecc.addLogListener(logListener); + } + } + } + // service registry Map<String, ServiceRegistry> serviceRegistries = registry.findByTypeWithName(ServiceRegistry.class); if (serviceRegistries != null && !serviceRegistries.isEmpty()) {