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) {