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 <[email protected]>
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) {