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 af8c0f1  CAMEL-14354: camel-core optimize
af8c0f1 is described below

commit af8c0f1f7572ab68df5c833a84b27201d5307e2d
Author: Claus Ibsen <claus.ib...@gmail.com>
AuthorDate: Sun Jan 26 09:33:23 2020 +0100

    CAMEL-14354: camel-core optimize
---
 .../main/java/org/apache/camel/CamelContext.java   |  6 ++++
 .../camel/impl/engine/AbstractCamelContext.java    |  9 ++++++
 .../camel/impl/engine/DefaultProducerCache.java    | 10 +++----
 .../camel/impl/engine/DefaultUnitOfWork.java       | 32 ++++++++++++----------
 .../org/apache/camel/processor/SendProcessor.java  |  2 +-
 .../errorhandler/RedeliveryErrorHandler.java       | 12 ++++++--
 .../java/org/apache/camel/support/EventHelper.java | 22 +++++++++++++++
 7 files changed, 70 insertions(+), 23 deletions(-)

diff --git a/core/camel-api/src/main/java/org/apache/camel/CamelContext.java 
b/core/camel-api/src/main/java/org/apache/camel/CamelContext.java
index eb9dd95..230dc2c 100644
--- a/core/camel-api/src/main/java/org/apache/camel/CamelContext.java
+++ b/core/camel-api/src/main/java/org/apache/camel/CamelContext.java
@@ -215,6 +215,12 @@ public interface CamelContext extends StatefulService, 
RuntimeConfiguration {
      */
     Date getStartDate();
 
+    /**
+     * Whether event notification is applicable (possible).
+     * This API is used internally in Camel as optimization.
+     */
+    boolean isEventNotificationApplicable();
+
     // Service Methods
     //-----------------------------------------------------------------------
 
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 2087f3d..9ba510d 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
@@ -262,6 +262,7 @@ public abstract class AbstractCamelContext extends 
ServiceSupport implements Ext
     private volatile ScheduledExecutorService errorHandlerExecutorService;
     private volatile BeanIntrospection beanIntrospection;
     private volatile Tracer tracer;
+    private volatile boolean eventNotificationApplicable;
     private final DeferServiceFactory deferServiceFactory = new 
DefaultDeferServiceFactory();
     private final AnnotationBasedProcessorFactory 
annotationBasedProcessorFactory = new DefaultAnnotationBasedProcessorFactory();
 
@@ -2156,6 +2157,11 @@ public abstract class AbstractCamelContext extends 
ServiceSupport implements Ext
     }
 
     @Override
+    public boolean isEventNotificationApplicable() {
+        return eventNotificationApplicable;
+    }
+
+    @Override
     public String getVersion() {
         if (version == null) {
             synchronized (lock) {
@@ -2565,6 +2571,9 @@ public abstract class AbstractCamelContext extends 
ServiceSupport implements Ext
         // start components
         startServices(components.values());
 
+        // optimize - before starting routes lets check if event notifications 
is possible
+        eventNotificationApplicable = EventHelper.eventsApplicable(this);
+
         // start the route definitions before the routes is started
         startRouteDefinitions();
 
diff --git 
a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultProducerCache.java
 
b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultProducerCache.java
index 635ab7b..e0b15ea 100644
--- 
a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultProducerCache.java
+++ 
b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultProducerCache.java
@@ -168,7 +168,7 @@ public class DefaultProducerCache extends ServiceSupport 
implements ProducerCach
             // send the exchange using the processor
             StopWatch watch = null;
             try {
-                if (eventNotifierEnabled) {
+                if (eventNotifierEnabled && 
camelContext.isEventNotificationApplicable()) {
                     boolean sending = 
EventHelper.notifyExchangeSending(exchange.getContext(), exchange, endpoint);
                     if (sending) {
                         watch = new StopWatch();
@@ -183,7 +183,7 @@ public class DefaultProducerCache extends ServiceSupport 
implements ProducerCach
                 exchange.setException(e);
             } finally {
                 // emit event that the exchange was sent to the endpoint
-                if (eventNotifierEnabled && watch != null) {
+                if (watch != null) {
                     long timeTaken = watch.taken();
                     EventHelper.notifyExchangeSent(exchange.getContext(), 
exchange, endpoint, timeTaken);
                 }
@@ -288,7 +288,7 @@ public class DefaultProducerCache extends ServiceSupport 
implements ProducerCach
         try {
             // record timing for sending the exchange using the producer
             StopWatch watch;
-            if (eventNotifierEnabled && exchange != null) {
+            if (eventNotifierEnabled && 
camelContext.isEventNotificationApplicable()) {
                 boolean sending = 
EventHelper.notifyExchangeSending(exchange.getContext(), exchange, endpoint);
                 if (sending) {
                     watch = new StopWatch();
@@ -302,7 +302,7 @@ public class DefaultProducerCache extends ServiceSupport 
implements ProducerCach
             // invoke the callback
             return producerCallback.doInAsyncProducer(producer, exchange, 
doneSync -> {
                 try {
-                    if (eventNotifierEnabled && watch != null) {
+                    if (watch != null) {
                         long timeTaken = watch.taken();
                         // emit event that the exchange was sent to the 
endpoint
                         EventHelper.notifyExchangeSent(exchange.getContext(), 
exchange, endpoint, timeTaken);
@@ -334,7 +334,7 @@ public class DefaultProducerCache extends ServiceSupport 
implements ProducerCach
 
         // send the exchange using the processor
         try {
-            if (eventNotifierEnabled) {
+            if (eventNotifierEnabled && 
camelContext.isEventNotificationApplicable()) {
                 callback = new EventNotifierCallback(callback, exchange, 
endpoint);
             }
             // invoke the asynchronous method
diff --git 
a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultUnitOfWork.java
 
b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultUnitOfWork.java
index 7c784be..8218d4f 100644
--- 
a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultUnitOfWork.java
+++ 
b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultUnitOfWork.java
@@ -109,11 +109,13 @@ public class DefaultUnitOfWork implements UnitOfWork, 
Service {
         }
         
         // fire event
-        try {
-            EventHelper.notifyExchangeCreated(context, exchange);
-        } catch (Throwable e) {
-            // must catch exceptions to ensure the exchange is not failing due 
to notification event failed
-            log.warn("Exception occurred during event notification. This 
exception will be ignored.", e);
+        if (context.isEventNotificationApplicable()) {
+            try {
+                EventHelper.notifyExchangeCreated(context, exchange);
+            } catch (Throwable e) {
+                // must catch exceptions to ensure the exchange is not failing 
due to notification event failed
+                log.warn("Exception occurred during event notification. This 
exception will be ignored.", e);
+            }
         }
 
         // register to inflight registry
@@ -213,16 +215,18 @@ public class DefaultUnitOfWork implements UnitOfWork, 
Service {
         // unregister from inflight registry, before signalling we are done
         inflightRepository.remove(exchange);
 
-        // then fire event to signal the exchange is done
-        try {
-            if (failed) {
-                EventHelper.notifyExchangeFailed(exchange.getContext(), 
exchange);
-            } else {
-                EventHelper.notifyExchangeDone(exchange.getContext(), 
exchange);
+        if (context.isEventNotificationApplicable()) {
+            // then fire event to signal the exchange is done
+            try {
+                if (failed) {
+                    EventHelper.notifyExchangeFailed(exchange.getContext(), 
exchange);
+                } else {
+                    EventHelper.notifyExchangeDone(exchange.getContext(), 
exchange);
+                }
+            } catch (Throwable e) {
+                // must catch exceptions to ensure synchronizations is also 
invoked
+                log.warn("Exception occurred during event notification. This 
exception will be ignored.", e);
             }
-        } catch (Throwable e) {
-            // must catch exceptions to ensure synchronizations is also invoked
-            log.warn("Exception occurred during event notification. This 
exception will be ignored.", e);
         }
     }
 
diff --git 
a/core/camel-base/src/main/java/org/apache/camel/processor/SendProcessor.java 
b/core/camel-base/src/main/java/org/apache/camel/processor/SendProcessor.java
index bb4f609..5f35371 100644
--- 
a/core/camel-base/src/main/java/org/apache/camel/processor/SendProcessor.java
+++ 
b/core/camel-base/src/main/java/org/apache/camel/processor/SendProcessor.java
@@ -136,7 +136,7 @@ public class SendProcessor extends AsyncProcessorSupport 
implements Traceable, E
 
             final Exchange target = configureExchange(exchange, pattern);
 
-            final boolean sending = 
EventHelper.notifyExchangeSending(exchange.getContext(), target, destination);
+            final boolean sending = 
camelContext.isEventNotificationApplicable() && 
EventHelper.notifyExchangeSending(exchange.getContext(), target, destination);
             // record timing for sending the exchange using the producer
             StopWatch watch;
             if (sending) {
diff --git 
a/core/camel-base/src/main/java/org/apache/camel/processor/errorhandler/RedeliveryErrorHandler.java
 
b/core/camel-base/src/main/java/org/apache/camel/processor/errorhandler/RedeliveryErrorHandler.java
index 06a2fd2..30d2eab 100644
--- 
a/core/camel-base/src/main/java/org/apache/camel/processor/errorhandler/RedeliveryErrorHandler.java
+++ 
b/core/camel-base/src/main/java/org/apache/camel/processor/errorhandler/RedeliveryErrorHandler.java
@@ -558,7 +558,9 @@ public abstract class RedeliveryErrorHandler extends 
ErrorHandlerSupport impleme
             }
 
             // emmit event we are doing redelivery
-            EventHelper.notifyExchangeRedelivery(exchange.getContext(), 
exchange, redeliveryCounter);
+            if (camelContext.isEventNotificationApplicable()) {
+                EventHelper.notifyExchangeRedelivery(exchange.getContext(), 
exchange, redeliveryCounter);
+            }
 
             // process the exchange (also redelivery)
             outputAsync.process(exchange, doneSync -> {
@@ -845,7 +847,9 @@ public abstract class RedeliveryErrorHandler extends 
ErrorHandlerSupport impleme
                 // fire event as we had a failure processor to handle it, 
which there is a event for
                 final boolean deadLetterChannel = processor == deadLetter;
 
-                
EventHelper.notifyExchangeFailureHandling(exchange.getContext(), exchange, 
processor, deadLetterChannel, deadLetterUri);
+                if (camelContext.isEventNotificationApplicable()) {
+                    
EventHelper.notifyExchangeFailureHandling(exchange.getContext(), exchange, 
processor, deadLetterChannel, deadLetterUri);
+                }
 
                 // the failure processor could also be asynchronous
                 AsyncProcessor afp = 
AsyncProcessorConverterHelper.convert(processor);
@@ -854,7 +858,9 @@ public abstract class RedeliveryErrorHandler extends 
ErrorHandlerSupport impleme
                     try {
                         prepareExchangeAfterFailure(exchange, 
isDeadLetterChannel, shouldHandle, shouldContinue);
                         // fire event as we had a failure processor to handle 
it, which there is a event for
-                        
EventHelper.notifyExchangeFailureHandled(exchange.getContext(), exchange, 
processor, deadLetterChannel, deadLetterUri);
+                        if (camelContext.isEventNotificationApplicable()) {
+                            
EventHelper.notifyExchangeFailureHandled(exchange.getContext(), exchange, 
processor, deadLetterChannel, deadLetterUri);
+                        }
                     } finally {
                         // if the fault was handled asynchronously, this 
should be reflected in the callback as well
                         reactiveExecutor.schedule(callback);
diff --git 
a/core/camel-support/src/main/java/org/apache/camel/support/EventHelper.java 
b/core/camel-support/src/main/java/org/apache/camel/support/EventHelper.java
index bccd0e4..5c81a46 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/EventHelper.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/EventHelper.java
@@ -45,6 +45,28 @@ public final class EventHelper {
     private EventHelper() {
     }
 
+    /**
+     * Checks whether event notifications is applicable or not
+     */
+    public static boolean eventsApplicable(CamelContext context) {
+        ManagementStrategy management = context.getManagementStrategy();
+        if (management == null) {
+            return false;
+        }
+
+        EventFactory factory = management.getEventFactory();
+        if (factory == null) {
+            return false;
+        }
+
+        List<EventNotifier> notifiers = management.getEventNotifiers();
+        if (notifiers == null || notifiers.isEmpty()) {
+            return false;
+        }
+
+        return true;
+    }
+
     public static boolean notifyCamelContextStarting(CamelContext context) {
         ManagementStrategy management = context.getManagementStrategy();
         if (management == null) {

Reply via email to