You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2020/11/09 10:50:10 UTC

[camel] branch master updated: camel-core - Optimize log to reuse default exchange formatter

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 <cl...@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()) {