You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by gn...@apache.org on 2020/03/25 15:23:08 UTC
[camel] 10/11: [CAMEL-14786] Move as much initialisation code from
start() to init() phase
This is an automated email from the ASF dual-hosted git repository.
gnodet pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git
commit be547c1d177aaec8c8520ac1970ef9b055b1deb7
Author: gnodet <gn...@gmail.com>
AuthorDate: Mon Mar 23 16:56:58 2020 +0100
[CAMEL-14786] Move as much initialisation code from start() to init() phase
---
.../camel/blueprint/BlueprintCamelContext.java | 6 +-
.../blueprint/handler/CamelNamespaceHandler.java | 2 +-
.../apache/camel/component/cron/CronComponent.java | 2 +-
.../spring/javaconfig/CamelConfiguration.java | 2 +-
.../main/java/org/apache/camel/spring/Main.java | 9 +-
.../camel/spring/CamelContextFactoryBean.java | 2 +-
.../apache/camel/spring/SpringCamelContext.java | 2 +-
.../spring/remoting/CamelServiceExporter.java | 4 +-
.../org/apache/camel/CamelContextLifecycle.java | 2 +
.../main/java/org/apache/camel/ServiceStatus.java | 12 +-
.../java/org/apache/camel/spi/EventFactory.java | 16 ++
.../org/apache/camel/spi/LifecycleStrategy.java | 10 +
.../apache/camel/support/service/BaseService.java | 41 +--
.../camel/support/service/ServiceHelper.java | 14 ++
.../AbstractLocationPropertiesSource.java | 10 -
.../component/properties/PropertiesComponent.java | 56 +++--
.../impl/converter/BaseTypeConverterRegistry.java | 2 +-
.../impl/converter/CoreTypeConverterRegistry.java | 3 -
.../camel/impl/converter/DefaultTypeConverter.java | 9 +-
.../TypeConvertersPackageScanClassResolver.java | 9 -
.../camel/impl/engine/AbstractCamelContext.java | 280 +++++++++++++--------
.../impl/engine/BaseExecutorServiceManager.java | 8 +-
.../engine/DefaultAsyncProcessorAwaitManager.java | 5 -
.../impl/engine/DefaultBeanIntrospection.java | 2 +-
.../camel/impl/engine/DefaultConsumerCache.java | 18 +-
.../camel/impl/engine/DefaultConsumerTemplate.java | 12 +-
.../impl/engine/DefaultFluentProducerTemplate.java | 41 +--
.../impl/engine/DefaultInflightRepository.java | 4 -
.../impl/engine/DefaultManagementStrategy.java | 48 ++--
.../impl/engine/DefaultMessageHistoryFactory.java | 9 -
.../engine/DefaultPackageScanClassResolver.java | 5 -
.../engine/DefaultPackageScanResourceResolver.java | 2 +-
.../camel/impl/engine/DefaultProducerCache.java | 20 +-
.../camel/impl/engine/DefaultProducerTemplate.java | 47 ++--
.../camel/impl/engine/DefaultReactiveExecutor.java | 5 -
.../org/apache/camel/impl/engine/DefaultRoute.java | 2 -
.../camel/impl/engine/DefaultRouteController.java | 14 --
.../engine/DefaultRuntimeEndpointRegistry.java | 7 +-
.../impl/event/CamelContextInitializedEvent.java | 33 +++
.../impl/event/CamelContextInitializingEvent.java | 33 +++
.../camel/impl/event/DefaultEventFactory.java | 10 +
.../camel/processor/RemovePropertiesProcessor.java | 9 -
.../processor/interceptor/DefaultDebugger.java | 10 +-
.../loadbalancer/LoadBalancerSupport.java | 5 +
.../camel/builder/AdviceWithRouteBuilder.java | 1 +
.../org/apache/camel/builder/NotifyBuilder.java | 3 +-
.../camel/impl/lw/LightweightCamelContext.java | 9 +-
.../impl/lw/LightweightRuntimeCamelContext.java | 10 +
.../core/xml/AbstractCamelContextFactoryBean.java | 2 -
.../java/org/apache/camel/ContextTestSupport.java | 25 +-
.../camel/builder/BuilderWithScopesTest.java | 2 +-
.../camel/impl/MultipleLifecycleStrategyTest.java | 6 +-
.../issues/SentExchangeEventNotifierIssueTest.java | 1 -
.../SentExchangeEventNotifierTwoIssueTest.java | 1 -
.../EventNotifierExchangeSentExampleTest.java | 1 -
.../ProducerTemplateDisableEventNotifierTest.java | 1 -
...litterUseOriginalNotPropagateExceptionTest.java | 1 -
.../EnricherAsyncUnhandledExceptionTest.java | 1 -
.../processor/enricher/EnricherSendEventTest.java | 1 -
.../DynamicRouterEventNotifierTest.java | 1 -
.../RecipientListEventNotifierTest.java | 1 -
.../routingslip/RoutingSlipEventNotifierTest.java | 1 -
.../org/apache/camel/main/BaseMainSupport.java | 2 +-
.../camel/management/DefaultManagementAgent.java | 18 +-
.../management/JmxManagementLifecycleStrategy.java | 94 +++----
.../camel/management/JmxManagementStrategy.java | 23 +-
.../management/JmxManagementStrategyFactory.java | 4 +-
...ationOnlyRegisterProcessorWithCustomIdTest.java | 1 -
.../ManagedCamelContextPropertiesTest.java | 1 -
.../camel/management/ManagedCamelContextTest.java | 3 +-
.../camel/management/ManagedDynamicRouterTest.java | 1 -
.../ManagedEndpointUtilizationStatisticsTest.java | 1 -
.../camel/management/ManagedEnricherTest.java | 1 -
.../management/ManagedNamePatternFixedTest.java | 1 -
.../ManagedNamePatternIncludeHostNameTest.java | 2 +-
.../camel/management/ManagedNamePatternTest.java | 1 -
.../management/ManagedNonManagedServiceTest.java | 2 +-
.../camel/management/ManagedPollEnricherTest.java | 1 -
...gedProducerRecipientListRegisterAlwaysTest.java | 1 -
...edProducerRouteAddRemoveRegisterAlwaysTest.java | 3 +-
.../camel/management/ManagedRecipientListTest.java | 1 -
.../management/ManagedRouteAddRemoveTest.java | 2 +-
.../camel/management/ManagedRoutingSlipTest.java | 1 -
.../camel/management/ManagedSanitizeTest.java | 1 -
.../ManagedSendDynamicProcessorTest.java | 1 -
.../camel/management/ManagedStartupFailedTest.java | 3 +-
.../management/ManagedStatisticsLevelOffTest.java | 1 -
.../ManagedStatisticsLevelRoutesOnlyTest.java | 1 -
.../camel/management/ManagedWireTapTest.java | 1 -
.../apache/camel/support/ChildServiceSupport.java | 25 +-
.../java/org/apache/camel/support/EventHelper.java | 200 ++-------------
docs/components/modules/ROOT/pages/index.adoc | 145 +++++++++++
92 files changed, 815 insertions(+), 637 deletions(-)
diff --git a/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintCamelContext.java b/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintCamelContext.java
index e9fcf46..8733ab0 100644
--- a/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintCamelContext.java
+++ b/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintCamelContext.java
@@ -76,7 +76,7 @@ public class BlueprintCamelContext extends DefaultCamelContext implements Servic
setLanguageResolver(new BlueprintLanguageResolver(bundleContext));
setDataFormatResolver(new BlueprintDataFormatResolver(bundleContext));
setApplicationContextClassLoader(new BundleDelegatingClassLoader(bundleContext.getBundle()));
- init();
+ build();
}
@Override
@@ -110,7 +110,7 @@ public class BlueprintCamelContext extends DefaultCamelContext implements Servic
}
@Override
- public void doInit() throws Exception {
+ public void doBuild() throws Exception {
LOG.trace("init {}", this);
// add service listener so we can be notified when blueprint container is done
// and we would be ready to start CamelContext
@@ -119,7 +119,7 @@ public class BlueprintCamelContext extends DefaultCamelContext implements Servic
// to support change events when it changes states
registration = bundleContext.registerService(BlueprintListener.class, this, null);
// call super
- super.doInit();
+ super.doBuild();
}
public void destroy() throws Exception {
diff --git a/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/handler/CamelNamespaceHandler.java b/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/handler/CamelNamespaceHandler.java
index f4c8173..3d71208 100644
--- a/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/handler/CamelNamespaceHandler.java
+++ b/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/handler/CamelNamespaceHandler.java
@@ -283,7 +283,7 @@ public class CamelNamespaceHandler implements NamespaceHandler {
ctx.setFactoryComponent(factory2);
ctx.setFactoryMethod("getContext");
ctx.addProperty("bundleStateService", createRef(context, ".camelBlueprint.bundleStateService"));
- ctx.setInitMethod("init");
+ ctx.setInitMethod("build");
ctx.setDestroyMethod("destroy");
// Register factory beans
diff --git a/components/camel-cron/src/main/java/org/apache/camel/component/cron/CronComponent.java b/components/camel-cron/src/main/java/org/apache/camel/component/cron/CronComponent.java
index 0a112a4..c48356c 100644
--- a/components/camel-cron/src/main/java/org/apache/camel/component/cron/CronComponent.java
+++ b/components/camel-cron/src/main/java/org/apache/camel/component/cron/CronComponent.java
@@ -60,7 +60,7 @@ public class CronComponent extends DefaultComponent {
}
@Override
- protected void doStart() throws Exception {
+ protected void doInit() throws Exception {
initCamelCronService();
}
diff --git a/components/camel-spring-javaconfig/src/main/java/org/apache/camel/spring/javaconfig/CamelConfiguration.java b/components/camel-spring-javaconfig/src/main/java/org/apache/camel/spring/javaconfig/CamelConfiguration.java
index adbfe6a..e98dbcc 100644
--- a/components/camel-spring-javaconfig/src/main/java/org/apache/camel/spring/javaconfig/CamelConfiguration.java
+++ b/components/camel-spring-javaconfig/src/main/java/org/apache/camel/spring/javaconfig/CamelConfiguration.java
@@ -161,7 +161,7 @@ public abstract class CamelConfiguration implements BeanFactoryAware, Applicatio
public CamelContext camelContext() throws Exception {
CamelContext camelContext = createCamelContext();
setupCamelContext(camelContext);
- camelContext.init();
+ camelContext.build();
return camelContext;
}
diff --git a/components/camel-spring-main/src/main/java/org/apache/camel/spring/Main.java b/components/camel-spring-main/src/main/java/org/apache/camel/spring/Main.java
index 92df8b0..940652a 100644
--- a/components/camel-spring-main/src/main/java/org/apache/camel/spring/Main.java
+++ b/components/camel-spring-main/src/main/java/org/apache/camel/spring/Main.java
@@ -30,7 +30,9 @@ import java.util.Set;
import org.apache.camel.CamelContext;
import org.apache.camel.ProducerTemplate;
import org.apache.camel.main.MainCommandLineSupport;
+import org.apache.camel.VetoCamelContextStartException;
import org.apache.camel.util.IOHelper;
+import org.apache.camel.util.ObjectHelper;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
@@ -177,10 +179,13 @@ public class Main extends MainCommandLineSupport {
applicationContext.start();
initCamelContext();
- } finally {
+ } catch (Exception e) {
// if we were veto started then mark as completed
- if (getCamelContext() != null && getCamelContext().isVetoStarted()) {
+ VetoCamelContextStartException veto = ObjectHelper.getException(VetoCamelContextStartException.class, e);
+ if (veto != null) {
completed();
+ } else {
+ throw e;
}
}
}
diff --git a/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java b/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java
index 3429e9d..364fcb7 100644
--- a/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java
+++ b/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java
@@ -483,7 +483,7 @@ public class CamelContextFactoryBean extends AbstractCamelContextFactoryBean<Spr
if (context == null && create) {
context = createContext();
configure(context);
- context.init();
+ context.build();
}
return context;
}
diff --git a/components/camel-spring/src/main/java/org/apache/camel/spring/SpringCamelContext.java b/components/camel-spring/src/main/java/org/apache/camel/spring/SpringCamelContext.java
index c4e344a..100f857 100644
--- a/components/camel-spring/src/main/java/org/apache/camel/spring/SpringCamelContext.java
+++ b/components/camel-spring/src/main/java/org/apache/camel/spring/SpringCamelContext.java
@@ -100,7 +100,7 @@ public class SpringCamelContext extends DefaultCamelContext implements Lifecycle
}
SpringCamelContext answer = new SpringCamelContext();
answer.setApplicationContext(applicationContext);
- answer.init();
+ answer.build();
if (maybeStart) {
answer.start();
}
diff --git a/components/camel-spring/src/main/java/org/apache/camel/spring/remoting/CamelServiceExporter.java b/components/camel-spring/src/main/java/org/apache/camel/spring/remoting/CamelServiceExporter.java
index ceed311..a7d3f85 100644
--- a/components/camel-spring/src/main/java/org/apache/camel/spring/remoting/CamelServiceExporter.java
+++ b/components/camel-spring/src/main/java/org/apache/camel/spring/remoting/CamelServiceExporter.java
@@ -114,12 +114,12 @@ public class CamelServiceExporter extends RemoteExporter implements Initializing
try {
// need to start endpoint before we create consumer
- ServiceHelper.startService(endpoint);
+ ServiceHelper.initService(endpoint);
BeanProcessor processor = new BeanProcessor(proxy, camelContext);
processor.setMethod(method);
consumer = endpoint.createConsumer(processor);
// add and start consumer
- camelContext.addService(consumer, true, true);
+ camelContext.addService(consumer, true, false);
} catch (Exception e) {
throw new FailedToCreateConsumerException(endpoint, e);
}
diff --git a/core/camel-api/src/main/java/org/apache/camel/CamelContextLifecycle.java b/core/camel-api/src/main/java/org/apache/camel/CamelContextLifecycle.java
index 7c4b327..152290b 100644
--- a/core/camel-api/src/main/java/org/apache/camel/CamelContextLifecycle.java
+++ b/core/camel-api/src/main/java/org/apache/camel/CamelContextLifecycle.java
@@ -90,6 +90,8 @@ public interface CamelContextLifecycle extends AutoCloseable {
*/
boolean isRunAllowed();
+ void build();
+
void init();
/**
diff --git a/core/camel-api/src/main/java/org/apache/camel/ServiceStatus.java b/core/camel-api/src/main/java/org/apache/camel/ServiceStatus.java
index 312a42c..6f4d941 100644
--- a/core/camel-api/src/main/java/org/apache/camel/ServiceStatus.java
+++ b/core/camel-api/src/main/java/org/apache/camel/ServiceStatus.java
@@ -22,10 +22,10 @@ import java.io.Serializable;
* Represents the status of a {@link Service} instance
*/
public enum ServiceStatus implements Serializable {
- Starting, Started, Stopping, Stopped, Suspending, Suspended;
+ Initializing, Initialized, Starting, Started, Stopping, Stopped, Suspending, Suspended;
public boolean isStartable() {
- return this == Stopped || this == Suspended;
+ return this == Initialized || this == Stopped || this == Suspended;
}
public boolean isStoppable() {
@@ -36,6 +36,14 @@ public enum ServiceStatus implements Serializable {
return this == Started;
}
+ public boolean isInitializing() {
+ return this == Initializing;
+ }
+
+ public boolean isInitialized() {
+ return this == Initialized;
+ }
+
public boolean isStarting() {
return this == Starting;
}
diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/EventFactory.java b/core/camel-api/src/main/java/org/apache/camel/spi/EventFactory.java
index 41754e7..b9de47f 100644
--- a/core/camel-api/src/main/java/org/apache/camel/spi/EventFactory.java
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/EventFactory.java
@@ -30,6 +30,22 @@ import org.apache.camel.Route;
public interface EventFactory {
/**
+ * Creates an {@link CamelEvent} for Camel is initializing.
+ *
+ * @param context camel context
+ * @return the created event
+ */
+ CamelEvent createCamelContextInitializingEvent(CamelContext context);
+
+ /**
+ * Creates an {@link CamelEvent} for Camel has been initialized successfully.
+ *
+ * @param context camel context
+ * @return the created event
+ */
+ CamelEvent createCamelContextInitializedEvent(CamelContext context);
+
+ /**
* Creates an {@link CamelEvent} for Camel is starting.
*
* @param context camel context
diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/LifecycleStrategy.java b/core/camel-api/src/main/java/org/apache/camel/spi/LifecycleStrategy.java
index 20ddeaa..cf74794 100644
--- a/core/camel-api/src/main/java/org/apache/camel/spi/LifecycleStrategy.java
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/LifecycleStrategy.java
@@ -34,6 +34,16 @@ import org.apache.camel.VetoCamelContextStartException;
public interface LifecycleStrategy {
/**
+ * Notification on initializing a {@link CamelContext}.
+ *
+ * @param context the camel context
+ * @throws VetoCamelContextStartException can be thrown to veto starting {@link CamelContext}.
+ * Any other runtime exceptions will be logged at <tt>WARN</tt> level by Camel will continue starting itself.
+ */
+ default void onContextInitialized(CamelContext context) throws VetoCamelContextStartException {
+ }
+
+ /**
* Notification on starting a {@link CamelContext}.
*
* @param context the camel context
diff --git a/core/camel-api/src/main/java/org/apache/camel/support/service/BaseService.java b/core/camel-api/src/main/java/org/apache/camel/support/service/BaseService.java
index d408b10..054235b 100644
--- a/core/camel-api/src/main/java/org/apache/camel/support/service/BaseService.java
+++ b/core/camel-api/src/main/java/org/apache/camel/support/service/BaseService.java
@@ -37,16 +37,17 @@ public abstract class BaseService {
protected static final byte NEW = 0;
protected static final byte BUILDED = 1;
- protected static final byte INITIALIZED = 2;
- protected static final byte STARTING = 3;
- protected static final byte STARTED = 4;
- protected static final byte SUSPENDING = 5;
- protected static final byte SUSPENDED = 6;
- protected static final byte STOPPING = 7;
- protected static final byte STOPPED = 8;
- protected static final byte SHUTTINGDOWN = 9;
- protected static final byte SHUTDOWN = 10;
- protected static final byte FAILED = 11;
+ protected static final byte INITIALIZING = 2;
+ protected static final byte INITIALIZED = 3;
+ protected static final byte STARTING = 4;
+ protected static final byte STARTED = 5;
+ protected static final byte SUSPENDING = 6;
+ protected static final byte SUSPENDED = 7;
+ protected static final byte STOPPING = 8;
+ protected static final byte STOPPED = 9;
+ protected static final byte SHUTTINGDOWN = 10;
+ protected static final byte SHUTDOWN = 11;
+ protected static final byte FAILED = 12;
private static final Logger LOG = LoggerFactory.getLogger(BaseService.class);
@@ -75,15 +76,17 @@ public abstract class BaseService {
if (status <= BUILDED || status >= STOPPED) {
synchronized (lock) {
if (status <= BUILDED || status >= STOPPED) {
+ build();
LOG.trace("Initializing service: {}", this);
try (AutoCloseable ignored = doLifecycleChange()) {
+ status = INITIALIZING;
doInit();
+ status = INITIALIZED;
+ LOG.trace("Initialized service: {}", this);
} catch (Exception e) {
LOG.trace("Error while initializing service: " + this, e);
fail(e);
}
- status = INITIALIZED;
- LOG.trace("Initialized service: {}", this);
}
}
}
@@ -245,6 +248,10 @@ public abstract class BaseService {
public ServiceStatus getStatus() {
switch (status) {
+ case INITIALIZING:
+ return ServiceStatus.Initializing;
+ case INITIALIZED:
+ return ServiceStatus.Initialized;
case STARTING:
return ServiceStatus.Starting;
case STARTED:
@@ -338,6 +345,7 @@ public abstract class BaseService {
* This method will only be called by frameworks which supports pre-building projects such as camel-quarkus.
*/
protected void doBuild() throws Exception {
+ // noop
}
/**
@@ -345,6 +353,7 @@ public abstract class BaseService {
* This method will only be called once before starting.
*/
protected void doInit() throws Exception {
+ // noop
}
/**
@@ -354,7 +363,9 @@ public abstract class BaseService {
*
* @see #doStop()
*/
- protected abstract void doStart() throws Exception;
+ protected void doStart() throws Exception {
+ // noop
+ }
/**
* Implementations override this method to support customized start/stop.
@@ -368,7 +379,9 @@ public abstract class BaseService {
*
* @see #doStart()
*/
- protected abstract void doStop() throws Exception;
+ protected void doStop() throws Exception {
+ // noop
+ }
/**
* Implementations override this method to support customized suspend/resume.
diff --git a/core/camel-api/src/main/java/org/apache/camel/support/service/ServiceHelper.java b/core/camel-api/src/main/java/org/apache/camel/support/service/ServiceHelper.java
index 6ecfdc7..6ae854a 100644
--- a/core/camel-api/src/main/java/org/apache/camel/support/service/ServiceHelper.java
+++ b/core/camel-api/src/main/java/org/apache/camel/support/service/ServiceHelper.java
@@ -61,6 +61,20 @@ public final class ServiceHelper {
}
/**
+ * Initializes each element of the given {@code services} if {@code services} itself is
+ * not {@code null}, otherwise this method would return immediately.
+ *
+ * @see #initService(Object)
+ */
+ public static void initService(Object... services) {
+ if (services != null) {
+ for (Object o : services) {
+ initService(o);
+ }
+ }
+ }
+
+ /**
* Starts the given {@code value} if it's a {@link Service} or a collection of it.
* <p/>
* Calling this method has no effect if {@code value} is {@code null}.
diff --git a/core/camel-base/src/main/java/org/apache/camel/component/properties/AbstractLocationPropertiesSource.java b/core/camel-base/src/main/java/org/apache/camel/component/properties/AbstractLocationPropertiesSource.java
index 1e08cb5..306ef8a 100644
--- a/core/camel-base/src/main/java/org/apache/camel/component/properties/AbstractLocationPropertiesSource.java
+++ b/core/camel-base/src/main/java/org/apache/camel/component/properties/AbstractLocationPropertiesSource.java
@@ -79,16 +79,6 @@ public abstract class AbstractLocationPropertiesSource extends ServiceSupport im
}
}
- @Override
- protected void doStart() throws Exception {
- // noop
- }
-
- @Override
- protected void doStop() throws Exception {
- // noop
- }
-
/**
* Strategy to prepare loaded properties before being used by Camel.
* <p/>
diff --git a/core/camel-base/src/main/java/org/apache/camel/component/properties/PropertiesComponent.java b/core/camel-base/src/main/java/org/apache/camel/component/properties/PropertiesComponent.java
index 138d223..36d66f8 100644
--- a/core/camel-base/src/main/java/org/apache/camel/component/properties/PropertiesComponent.java
+++ b/core/camel-base/src/main/java/org/apache/camel/component/properties/PropertiesComponent.java
@@ -513,10 +513,15 @@ public class PropertiesComponent extends ServiceSupport implements org.apache.ca
if (propertiesSource instanceof CamelContextAware) {
((CamelContextAware) propertiesSource).setCamelContext(getCamelContext());
}
- sources.add(propertiesSource);
- if (!this.isNew()) {
- // if we have already initialized or started then we should also init the source
- ServiceHelper.initService(propertiesSource);
+ synchronized (lock) {
+ sources.add(propertiesSource);
+ if (!isNew()) {
+ // if we have already initialized or started then we should also init the source
+ ServiceHelper.initService(propertiesSource);
+ }
+ if (isStarted()) {
+ ServiceHelper.startService(propertiesSource);
+ }
}
}
@@ -528,6 +533,24 @@ public class PropertiesComponent extends ServiceSupport implements org.apache.ca
protected void doInit() throws Exception {
super.doInit();
+ ObjectHelper.notNull(camelContext, "CamelContext", this);
+
+ if (systemPropertiesMode != SYSTEM_PROPERTIES_MODE_NEVER
+ && systemPropertiesMode != SYSTEM_PROPERTIES_MODE_FALLBACK
+ && systemPropertiesMode != SYSTEM_PROPERTIES_MODE_OVERRIDE) {
+ throw new IllegalArgumentException("Option systemPropertiesMode has invalid value: " + systemPropertiesMode);
+ }
+ if (environmentVariableMode != ENVIRONMENT_VARIABLES_MODE_NEVER
+ && environmentVariableMode != ENVIRONMENT_VARIABLES_MODE_FALLBACK
+ && environmentVariableMode != ENVIRONMENT_VARIABLES_MODE_OVERRIDE) {
+ throw new IllegalArgumentException("Option environmentVariableMode has invalid value: " + environmentVariableMode);
+ }
+
+ // inject the component to the parser
+ if (propertiesParser instanceof DefaultPropertiesParser) {
+ ((DefaultPropertiesParser) propertiesParser).setPropertiesComponent(this);
+ }
+
if (isAutoDiscoverPropertiesSources()) {
// discover any 3rd party properties sources
try {
@@ -553,35 +576,22 @@ public class PropertiesComponent extends ServiceSupport implements org.apache.ca
}
}
+ sources.sort(OrderedComparator.get());
ServiceHelper.initService(sources);
}
@Override
protected void doStart() throws Exception {
- ObjectHelper.notNull(camelContext, "CamelContext", this);
-
- sources.sort(OrderedComparator.get());
ServiceHelper.startService(sources);
-
- if (systemPropertiesMode != SYSTEM_PROPERTIES_MODE_NEVER
- && systemPropertiesMode != SYSTEM_PROPERTIES_MODE_FALLBACK
- && systemPropertiesMode != SYSTEM_PROPERTIES_MODE_OVERRIDE) {
- throw new IllegalArgumentException("Option systemPropertiesMode has invalid value: " + systemPropertiesMode);
- }
- if (environmentVariableMode != ENVIRONMENT_VARIABLES_MODE_NEVER
- && environmentVariableMode != ENVIRONMENT_VARIABLES_MODE_FALLBACK
- && environmentVariableMode != ENVIRONMENT_VARIABLES_MODE_OVERRIDE) {
- throw new IllegalArgumentException("Option environmentVariableMode has invalid value: " + environmentVariableMode);
- }
-
- // inject the component to the parser
- if (propertiesParser instanceof DefaultPropertiesParser) {
- ((DefaultPropertiesParser) propertiesParser).setPropertiesComponent(this);
- }
}
@Override
protected void doStop() throws Exception {
+ ServiceHelper.stopService(sources);
+ }
+
+ @Override
+ protected void doShutdown() throws Exception {
ServiceHelper.stopAndShutdownServices(sources);
}
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/converter/BaseTypeConverterRegistry.java b/core/camel-base/src/main/java/org/apache/camel/impl/converter/BaseTypeConverterRegistry.java
index ee08b33..7b58856 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/converter/BaseTypeConverterRegistry.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/converter/BaseTypeConverterRegistry.java
@@ -272,7 +272,7 @@ public abstract class BaseTypeConverterRegistry extends CoreTypeConverterRegistr
}
@Override
- protected void doInit() {
+ protected void doInit() throws Exception {
if (injector == null && camelContext != null) {
injector = camelContext.getInjector();
}
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/converter/CoreTypeConverterRegistry.java b/core/camel-base/src/main/java/org/apache/camel/impl/converter/CoreTypeConverterRegistry.java
index 5df13ca..b0456ce 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/converter/CoreTypeConverterRegistry.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/converter/CoreTypeConverterRegistry.java
@@ -587,9 +587,6 @@ public class CoreTypeConverterRegistry extends ServiceSupport implements TypeCon
this.typeConverterExists = typeConverterExists;
}
- protected void doStart() throws Exception {
- }
-
protected void doStop() throws Exception {
// log utilization statistics when stopping, including mappings
if (statistics.isStatisticsEnabled()) {
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/converter/DefaultTypeConverter.java b/core/camel-base/src/main/java/org/apache/camel/impl/converter/DefaultTypeConverter.java
index bc8a6a2..e311563 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/converter/DefaultTypeConverter.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/converter/DefaultTypeConverter.java
@@ -57,15 +57,10 @@ public class DefaultTypeConverter extends BaseTypeConverterRegistry implements A
}
@Override
- protected void doInit() {
- super.doInit();
- }
-
- @Override
- protected void doStart() throws Exception {
+ protected void doInit() throws Exception {
StopWatch watch = new StopWatch();
- super.doStart();
+ super.doInit();
// core type converters is always loaded which does not use any classpath scanning and therefore is fast
loadCoreAndFastTypeConverters();
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/converter/TypeConvertersPackageScanClassResolver.java b/core/camel-base/src/main/java/org/apache/camel/impl/converter/TypeConvertersPackageScanClassResolver.java
index 4898a7c..1aa3a12 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/converter/TypeConvertersPackageScanClassResolver.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/converter/TypeConvertersPackageScanClassResolver.java
@@ -96,13 +96,4 @@ public class TypeConvertersPackageScanClassResolver extends ServiceSupport imple
// noop
}
- @Override
- protected void doStart() throws Exception {
- // noop
- }
-
- @Override
- protected void doStop() throws Exception {
- // noop
- }
}
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 2980c01..e6cabb6 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
@@ -325,7 +325,7 @@ public abstract class AbstractCamelContext extends BaseService
setRegistry(registry);
}
- public AbstractCamelContext(boolean init) {
+ public AbstractCamelContext(boolean build) {
// create a provisional (temporary) endpoint registry at first since end
// users may access endpoints before CamelContext is started
// we will later transfer the endpoints to the actual
@@ -337,9 +337,9 @@ public abstract class AbstractCamelContext extends BaseService
setDefaultExtension(HealthCheckRegistry.class, this::createHealthCheckRegistry);
- if (init) {
+ if (build) {
try {
- init();
+ build();
} catch (Exception e) {
throw new RuntimeException("Error initializing CamelContext", e);
}
@@ -506,7 +506,7 @@ public abstract class AbstractCamelContext extends BaseService
@Override
public Component getComponent(String name, boolean autoCreateComponents, boolean autoStart) {
// ensure CamelContext are initialized before we can get a component
- init();
+ build();
// Check if the named component is already being created, that would mean
// that the initComponent has triggered a new getComponent
@@ -594,7 +594,7 @@ public abstract class AbstractCamelContext extends BaseService
component = getComponentResolver().resolveComponent(name, getCamelContextReference());
if (component != null) {
component.setCamelContext(getCamelContextReference());
- ServiceHelper.initService(component);
+ component.build();
postInitComponent(name, component);
}
} catch (Exception e) {
@@ -778,8 +778,8 @@ public abstract class AbstractCamelContext extends BaseService
}
protected Endpoint doGetEndpoint(String uri, boolean normalized, boolean prototype) {
- // ensure CamelContext are initialized before we can get an endpoint
- init();
+ // ensure CamelContext are initialized before we can get a component
+ build();
StringHelper.notEmpty(uri, "uri");
@@ -827,6 +827,7 @@ public abstract class AbstractCamelContext extends BaseService
}
LOG.trace("Endpoint uri: {} is from component with name: {}", uri, scheme);
Component component = getComponent(scheme);
+ ServiceHelper.initService(component);
// Ask the component to resolve the endpoint.
if (component != null) {
@@ -1163,7 +1164,7 @@ public abstract class AbstractCamelContext extends BaseService
@Override
public void addRoutes(final RoutesBuilder builder) throws Exception {
try (LifecycleHelper helper = new LifecycleHelper()) {
- init();
+ build();
LOG.debug("Adding routes from builder: {}", builder);
builder.addRoutesToCamelContext(AbstractCamelContext.this);
}
@@ -1446,12 +1447,13 @@ public abstract class AbstractCamelContext extends BaseService
} else {
route = setupRoute.get();
}
- strategy.onServiceAdd(this, service, route);
+ strategy.onServiceAdd(getCamelContextReference(), service, route);
}
}
}
if (!forceStart) {
+ ServiceHelper.initService(service);
// now start the service (and defer starting if CamelContext is
// starting up itself)
deferStartService(object, stopOnShutdown);
@@ -1474,7 +1476,11 @@ public abstract class AbstractCamelContext extends BaseService
}
}
}
- ServiceHelper.startService(service);
+ if (isStartingOrStarted()) {
+ ServiceHelper.startService(service);
+ } else {
+ ServiceHelper.initService(service);
+ }
}
}
}
@@ -2414,24 +2420,19 @@ public abstract class AbstractCamelContext extends BaseService
}
@Override
- public void doInit() throws Exception {
- // Initialize LRUCacheFactory as eager as possible,
- // to let it warm up concurrently while Camel is startup up
- if (initialization != Initialization.Lazy) {
- LRUCacheFactory.init();
- }
+ public void init() {
+ super.init();
- // Setup management first since end users may use it to add event
- // notifiers using the management strategy before the CamelContext has been started
- setupManagement(null);
-
- // Call all registered trackers with this context
- // Note, this may use a partially constructed object
- CamelContextTracker.notifyContextCreated(this);
-
- // Setup type converter eager as its highly in use and should not be lazy initialized
- if (eagerCreateTypeConverter()) {
- getOrCreateTypeConverter();
+ // was the initialization vetoed?
+ if (vetoed != null) {
+ if (vetoed.isRethrowException()) {
+ throw RuntimeCamelException.wrapRuntimeException(vetoed);
+ } else {
+ LOG.info("CamelContext ({}) vetoed to not initialize due to {}", getName(), vetoed.getMessage());
+ // swallow exception and change state of this camel context to stopped
+ fail(vetoed);
+ return;
+ }
}
}
@@ -2439,12 +2440,17 @@ public abstract class AbstractCamelContext extends BaseService
public void start() {
super.start();
+ //
+ // We need to perform the following actions after the {@link #start()} method
+ // is called, so that the state of the {@link CamelContext} is <code>Started<code>.
+ //
+
// did the start veto?
if (vetoed != null) {
if (vetoed.isRethrowException()) {
throw RuntimeCamelException.wrapRuntimeException(vetoed);
} else {
- LOG.info("CamelContext ({}) vetoed to not start due {}", getName(), vetoed.getMessage());
+ LOG.info("CamelContext ({}) vetoed to not start due to {}", getName(), vetoed.getMessage());
// swallow exception and change state of this camel context to stopped
stop();
return;
@@ -2468,7 +2474,129 @@ public abstract class AbstractCamelContext extends BaseService
}
@Override
- protected synchronized void doStart() throws Exception {
+ public void doBuild() throws Exception {
+ // Initialize LRUCacheFactory as eager as possible,
+ // to let it warm up concurrently while Camel is startup up
+ if (initialization != Initialization.Lazy) {
+ LRUCacheFactory.init();
+ }
+
+ // Setup management first since end users may use it to add event
+ // notifiers using the management strategy before the CamelContext has been started
+ setupManagement(null);
+
+ // Call all registered trackers with this context
+ // Note, this may use a partially constructed object
+ CamelContextTracker.notifyContextCreated(this);
+
+ // Setup type converter eager as its highly in use and should not be lazy initialized
+ if (eagerCreateTypeConverter()) {
+ getOrCreateTypeConverter();
+ }
+
+ }
+
+ @Override
+ public void doInit() throws Exception {
+ // Start the route controller
+ getRouteController();
+ ServiceHelper.initService(this.routeController);
+
+ // optimize - before starting routes lets check if event notifications is possible
+ eventNotificationApplicable = EventHelper.eventsApplicable(this);
+
+ // ensure additional type converters is loaded
+ if (loadTypeConverters && typeConverter instanceof AnnotationScanTypeConverters) {
+ ((AnnotationScanTypeConverters) typeConverter).scanTypeConverters();
+ }
+
+ // custom properties may use property placeholders so resolve those
+ // early on
+ if (globalOptions != null && !globalOptions.isEmpty()) {
+ for (Map.Entry<String, String> entry : globalOptions.entrySet()) {
+ String key = entry.getKey();
+ String value = entry.getValue();
+ if (value != null) {
+ String replaced = resolvePropertyPlaceholders(value);
+ if (!value.equals(replaced)) {
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Camel property with key {} replaced value from {} -> {}", key, value, replaced);
+ }
+ entry.setValue(replaced);
+ }
+ }
+ }
+ }
+
+ forceLazyInitialization();
+
+ addService(getManagementStrategy(), false);
+ ServiceHelper.initService(lifecycleStrategies);
+ for (LifecycleStrategy strategy : lifecycleStrategies) {
+ try {
+ strategy.onContextInitialized(this);
+ } catch (VetoCamelContextStartException e) {
+ // okay we should not start Camel since it was vetoed
+ LOG.warn("Lifecycle strategy " + strategy + " vetoed initializing CamelContext ({}) due to: {}", getName(), e.getMessage());
+ throw e;
+ } catch (Exception e) {
+ LOG.warn("Lifecycle strategy " + strategy + " failed initializing CamelContext ({}) due to: {}", getName(), e.getMessage());
+ throw e;
+ }
+ }
+
+ // optimize - before starting routes lets check if event notifications is possible
+ eventNotificationApplicable = EventHelper.eventsApplicable(this);
+
+ // start notifiers as services
+ for (EventNotifier notifier : getManagementStrategy().getEventNotifiers()) {
+ if (notifier instanceof Service) {
+ Service service = (Service) notifier;
+ for (LifecycleStrategy strategy : lifecycleStrategies) {
+ strategy.onServiceAdd(getCamelContextReference(), service, null);
+ }
+ }
+ ServiceHelper.initService(notifier);
+ }
+
+ EventHelper.notifyCamelContextInitializing(this);
+
+ // re-create endpoint registry as the cache size limit may be set after the constructor of this instance was called.
+ // and we needed to create endpoints up-front as it may be accessed before this context is started
+ endpoints = doAddService(createEndpointRegistry(endpoints));
+
+ // optimised to not include runtimeEndpointRegistry unless startServices
+ // is enabled or JMX statistics is in extended mode
+ if (runtimeEndpointRegistry == null && getManagementStrategy() != null && getManagementStrategy().getManagementAgent() != null) {
+ Boolean isEnabled = getManagementStrategy().getManagementAgent().getEndpointRuntimeStatisticsEnabled();
+ boolean isExtended = getManagementStrategy().getManagementAgent().getStatisticsLevel().isExtended();
+ // extended mode is either if we use Extended statistics level or
+ // the option is explicit enabled
+ boolean extended = isExtended || isEnabled != null && isEnabled;
+ if (extended) {
+ runtimeEndpointRegistry = new DefaultRuntimeEndpointRegistry();
+ }
+ }
+ if (runtimeEndpointRegistry != null) {
+ if (runtimeEndpointRegistry instanceof EventNotifier && getManagementStrategy() != null) {
+ getManagementStrategy().addEventNotifier((EventNotifier)runtimeEndpointRegistry);
+ }
+ addService(runtimeEndpointRegistry, true, true);
+ }
+
+ bindDataFormats();
+
+ // start components
+ ServiceHelper.initService(components.values());
+
+ // start the route definitions before the routes is started
+ startRouteDefinitions();
+
+ EventHelper.notifyCamelContextInitialized(this);
+ }
+
+ @Override
+ protected void doStart() throws Exception {
try {
doStartContext();
} catch (Exception e) {
@@ -2480,20 +2608,16 @@ public abstract class AbstractCamelContext extends BaseService
}
protected void doStartContext() throws Exception {
- startDate = new Date();
-
+ LOG.info("Apache Camel {} (CamelContext: {}) is starting", getVersion(), getName());
vetoed = null;
+ startDate = new Date();
stopWatch.restart();
- LOG.info("Apache Camel {} (CamelContext: {}) is starting", getVersion(), getName());
// Start the route controller
ServiceHelper.startService(this.routeController);
doNotStartRoutesOnFirstStart = !firstStartDone && !isAutoStartup();
- // optimize - before starting routes lets check if event notifications is possible
- eventNotificationApplicable = EventHelper.eventsApplicable(this);
-
// if the context was configured with auto startup = false, and we
// are already started,
// then we may need to start the routes on the 2nd start call
@@ -2546,38 +2670,13 @@ public abstract class AbstractCamelContext extends BaseService
}
protected void doStartCamel() throws Exception {
- // ensure additional type converters is loaded
- if (loadTypeConverters && typeConverter instanceof AnnotationScanTypeConverters) {
- ((AnnotationScanTypeConverters) typeConverter).scanTypeConverters();
- }
-
- // custom properties may use property placeholders so resolve those
- // early on
- if (globalOptions != null && !globalOptions.isEmpty()) {
- for (Map.Entry<String, String> entry : globalOptions.entrySet()) {
- String key = entry.getKey();
- String value = entry.getValue();
- if (value != null) {
- String replaced = resolvePropertyPlaceholders(value);
- if (!value.equals(replaced)) {
- if (LOG.isDebugEnabled()) {
- LOG.debug("Camel property with key {} replaced value from {} -> {}", key, value, replaced);
- }
- entry.setValue(replaced);
- }
- }
- }
- }
-
if (LOG.isDebugEnabled()) {
LOG.debug("Using ClassResolver={}, PackageScanClassResolver={}, ApplicationContextClassLoader={}, RouteController={}", getClassResolver(),
getPackageScanClassResolver(), getApplicationContextClassLoader(), getRouteController());
}
-
if (isStreamCaching()) {
LOG.info("StreamCaching is enabled on CamelContext: {}", getName());
}
-
if (isBacklogTracing()) {
// tracing is added in the DefaultChannel so we can enable it on the fly
LOG.info("Backlog Tracing is enabled on CamelContext: {}", getName());
@@ -2586,7 +2685,6 @@ public abstract class AbstractCamelContext extends BaseService
// tracing is added in the DefaultChannel so we can enable it on the fly
LOG.info("Tracing is enabled on CamelContext: {}", getName());
}
-
if (isUseMDCLogging()) {
// log if MDC has been enabled
String pattern = getMDCLoggingKeysPattern();
@@ -2596,7 +2694,6 @@ public abstract class AbstractCamelContext extends BaseService
LOG.info("MDC logging is enabled on CamelContext: {}", getName());
}
}
-
if (getDelayer() != null && getDelayer() > 0) {
LOG.info("Delayer is enabled with: {} ms. on CamelContext: {}", getDelayer(), getName());
}
@@ -2607,17 +2704,15 @@ public abstract class AbstractCamelContext extends BaseService
// start lifecycle strategies
ServiceHelper.startService(lifecycleStrategies);
- Iterator<LifecycleStrategy> it = lifecycleStrategies.iterator();
- while (it.hasNext()) {
- LifecycleStrategy strategy = it.next();
+ for (LifecycleStrategy strategy : lifecycleStrategies) {
try {
strategy.onContextStart(this);
} catch (VetoCamelContextStartException e) {
// okay we should not start Camel since it was vetoed
- LOG.warn("Lifecycle strategy vetoed starting CamelContext ({}) due: {}", getName(), e.getMessage());
+ LOG.warn("Lifecycle strategy " + strategy + " vetoed starting CamelContext ({}) due to: {}", getName(), e.getMessage());
throw e;
} catch (Exception e) {
- LOG.warn("Lifecycle strategy " + strategy + " failed starting CamelContext ({}) due: {}", getName(), e.getMessage());
+ LOG.warn("Lifecycle strategy " + strategy + " failed starting CamelContext ({}) due to: {}", getName(), e.getMessage());
throw e;
}
}
@@ -2625,51 +2720,16 @@ public abstract class AbstractCamelContext extends BaseService
// start notifiers as services
for (EventNotifier notifier : getManagementStrategy().getEventNotifiers()) {
if (notifier instanceof Service) {
- Service service = (Service)notifier;
- for (LifecycleStrategy strategy : lifecycleStrategies) {
- strategy.onServiceAdd(this, service, null);
- }
startService((Service)notifier);
}
}
- // must let some bootstrap service be started before we can notify the
- // starting event
+ // must let some bootstrap service be started before we can notify the starting event
EventHelper.notifyCamelContextStarting(this);
- forceLazyInitialization();
-
- // re-create endpoint registry as the cache size limit may be set after the constructor of this instance was called.
- // and we needed to create endpoints up-front as it may be accessed before this context is started
- endpoints = doAddService(createEndpointRegistry(endpoints));
-
- // optimised to not include runtimeEndpointRegistry unless startServices
- // its enabled or JMX statistics is in extended mode
- if (runtimeEndpointRegistry == null && getManagementStrategy() != null && getManagementStrategy().getManagementAgent() != null) {
- Boolean isEnabled = getManagementStrategy().getManagementAgent().getEndpointRuntimeStatisticsEnabled();
- boolean isExtended = getManagementStrategy().getManagementAgent().getStatisticsLevel().isExtended();
- // extended mode is either if we use Extended statistics level or
- // the option is explicit enabled
- boolean extended = isExtended || isEnabled != null && isEnabled;
- if (extended) {
- runtimeEndpointRegistry = new DefaultRuntimeEndpointRegistry();
- }
- }
- if (runtimeEndpointRegistry != null) {
- if (runtimeEndpointRegistry instanceof EventNotifier && getManagementStrategy() != null) {
- getManagementStrategy().addEventNotifier((EventNotifier)runtimeEndpointRegistry);
- }
- addService(runtimeEndpointRegistry, true, true);
- }
-
- bindDataFormats();
-
// start components
startServices(components.values());
- // start the route definitions before the routes is started
- startRouteDefinitions();
-
if (isUseDataType()) {
// log if DataType has been enabled
LOG.info("Message DataType is enabled on CamelContext: {}", getName());
@@ -2731,7 +2791,7 @@ public abstract class AbstractCamelContext extends BaseService
}
@Override
- protected synchronized void doStop() throws Exception {
+ protected void doStop() throws Exception {
stopWatch.restart();
LOG.info("Apache Camel {} (CamelContext: {}) is shutting down", getVersion(), getName());
EventHelper.notifyCamelContextStopping(this);
@@ -2828,8 +2888,10 @@ public abstract class AbstractCamelContext extends BaseService
EventHelper.notifyCamelContextStopped(this);
// stop the notifier service
- for (EventNotifier notifier : getManagementStrategy().getEventNotifiers()) {
- shutdownServices(notifier);
+ if (getManagementStrategy() != null) {
+ for (EventNotifier notifier : getManagementStrategy().getEventNotifiers()) {
+ shutdownServices(notifier);
+ }
}
// shutdown executor service, reactive executor and management as the last one
@@ -3681,7 +3743,7 @@ public abstract class AbstractCamelContext extends BaseService
public void disableJMX() {
if (isNew()) {
disableJMX = true;
- } else if (isInit()) {
+ } else if (isInit() || isBuild()) {
disableJMX = true;
// we are still in initializing mode, so we can disable JMX, by
// setting up management again
@@ -4038,7 +4100,7 @@ public abstract class AbstractCamelContext extends BaseService
if (isStartingOrStarted()) {
throw new IllegalStateException("Can not set debugger on a started CamelContext");
}
- this.debugger = doAddService(debugger);
+ this.debugger = doAddService(debugger, true, false, true);
// enable debugging if we set a custom debugger
setDebugging(true);
}
@@ -4057,7 +4119,7 @@ public abstract class AbstractCamelContext extends BaseService
@Override
public void setTracer(Tracer tracer) {
- this.tracer = tracer;
+ this.tracer = doAddService(tracer, true, false, true);
// enable tracing if we set a custom tracer
setTracing(true);
}
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/BaseExecutorServiceManager.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/BaseExecutorServiceManager.java
index 3428d2d..261e8e5 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/BaseExecutorServiceManager.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/BaseExecutorServiceManager.java
@@ -421,7 +421,8 @@ public class BaseExecutorServiceManager extends ServiceSupport implements Execut
}
@Override
- protected void doStart() throws Exception {
+ protected void doInit() throws Exception {
+ super.doInit();
if (threadNamePattern == null) {
// set default name pattern which includes the camel context name
threadNamePattern = "Camel (" + camelContext.getName() + ") thread ##counter# - #name#";
@@ -429,11 +430,6 @@ public class BaseExecutorServiceManager extends ServiceSupport implements Execut
}
@Override
- protected void doStop() throws Exception {
- // noop
- }
-
- @Override
protected void doShutdown() throws Exception {
// shutdown all remainder executor services by looping and doing this aggressively
// as by normal all threads pool should have been shutdown using proper lifecycle
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultAsyncProcessorAwaitManager.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultAsyncProcessorAwaitManager.java
index f3c2ad9..21dd10c 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultAsyncProcessorAwaitManager.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultAsyncProcessorAwaitManager.java
@@ -220,11 +220,6 @@ public class DefaultAsyncProcessorAwaitManager extends ServiceSupport implements
}
@Override
- protected void doStart() throws Exception {
- // noop
- }
-
- @Override
protected void doStop() throws Exception {
Collection<AwaitThread> threads = browse();
int count = threads.size();
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultBeanIntrospection.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultBeanIntrospection.java
index 69c01b5..3db2234 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultBeanIntrospection.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultBeanIntrospection.java
@@ -221,7 +221,7 @@ public class DefaultBeanIntrospection extends ServiceSupport implements BeanIntr
}
@Override
- protected void doStart() throws Exception {
+ protected void doInit() throws Exception {
if (camelContext != null) {
camelContext.addStartupListener(this);
}
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultConsumerCache.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultConsumerCache.java
index e77656f..cc90b9b 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultConsumerCache.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultConsumerCache.java
@@ -228,21 +228,29 @@ public class DefaultConsumerCache extends ServiceSupport implements ConsumerCach
}
@Override
- protected void doStart() throws Exception {
+ protected void doInit() throws Exception {
if (extendedStatistics) {
int max = maxCacheSize == 0 ? CamelContextHelper.getMaximumCachePoolSize(camelContext) : maxCacheSize;
statistics = new DefaultEndpointUtilizationStatistics(max);
}
- ServiceHelper.startService(consumers);
+ ServiceHelper.initService(consumers);
}
@Override
- protected void doStop() throws Exception {
- // when stopping we intend to shutdown
- ServiceHelper.stopAndShutdownServices(statistics, consumers);
+ protected void doStart() throws Exception {
if (statistics != null) {
statistics.clear();
}
+ ServiceHelper.startService(consumers);
}
+ @Override
+ protected void doStop() throws Exception {
+ ServiceHelper.stopService(consumers);
+ }
+
+ @Override
+ protected void doShutdown() throws Exception {
+ ServiceHelper.stopAndShutdownServices(consumers);
+ }
}
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultConsumerTemplate.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultConsumerTemplate.java
index cabf240..96cd50b 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultConsumerTemplate.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultConsumerTemplate.java
@@ -272,15 +272,25 @@ public class DefaultConsumerTemplate extends ServiceSupport implements ConsumerT
}
@Override
- protected void doStart() throws Exception {
+ protected void doInit() throws Exception {
if (consumerCache == null) {
consumerCache = new DefaultConsumerCache(this, camelContext, maximumCacheSize);
}
+ ServiceHelper.initService(consumerCache);
+ }
+
+ @Override
+ protected void doStart() throws Exception {
ServiceHelper.startService(consumerCache);
}
@Override
protected void doStop() throws Exception {
+ ServiceHelper.stopService(consumerCache);
+ }
+
+ @Override
+ protected void doShutdown() throws Exception {
// we should shutdown the services as this is our intention, to not re-use the services anymore
ServiceHelper.stopAndShutdownService(consumerCache);
consumerCache = null;
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultFluentProducerTemplate.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultFluentProducerTemplate.java
index 74dda14..312593a 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultFluentProducerTemplate.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultFluentProducerTemplate.java
@@ -337,23 +337,12 @@ public class DefaultFluentProducerTemplate extends ServiceSupport implements Flu
* @param context the camel context
*/
public static FluentProducerTemplate on(CamelContext context) {
- return new DefaultFluentProducerTemplate(context);
+ DefaultFluentProducerTemplate fluent = new DefaultFluentProducerTemplate(context);
+ fluent.start();
+ return fluent;
}
private ProducerTemplate template() {
- ObjectHelper.notNull(context, "CamelContext");
-
- if (template == null) {
- template = context.createProducerTemplate(maximumCacheSize);
- if (defaultEndpoint != null) {
- template.setDefaultEndpoint(defaultEndpoint);
- }
- template.setEventNotifierEnabled(eventNotifierEnabled);
- if (templateCustomizer.get() != null) {
- templateCustomizer.get().accept(template);
- }
- }
-
return template;
}
@@ -390,10 +379,21 @@ public class DefaultFluentProducerTemplate extends ServiceSupport implements Flu
}
@Override
- protected void doStart() throws Exception {
- if (template == null) {
- template = template();
+ protected void doInit() throws Exception {
+ ObjectHelper.notNull(context, "CamelContext");
+ template = context.createProducerTemplate(maximumCacheSize);
+ if (defaultEndpoint != null) {
+ template.setDefaultEndpoint(defaultEndpoint);
+ }
+ template.setEventNotifierEnabled(eventNotifierEnabled);
+ if (templateCustomizer.get() != null) {
+ templateCustomizer.get().accept(template);
}
+ ServiceHelper.initService(template);
+ }
+
+ @Override
+ protected void doStart() throws Exception {
ServiceHelper.startService(template);
}
@@ -404,7 +404,12 @@ public class DefaultFluentProducerTemplate extends ServiceSupport implements Flu
this.exchangeSupplier.remove();
this.processorSupplier.remove();
this.templateCustomizer.remove();
-
ServiceHelper.stopService(template);
}
+
+ @Override
+ protected void doShutdown() throws Exception {
+ ServiceHelper.stopAndShutdownService(template);
+ template = null;
+ }
}
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultInflightRepository.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultInflightRepository.java
index 79adbe9..3634ec8 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultInflightRepository.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultInflightRepository.java
@@ -198,10 +198,6 @@ public class DefaultInflightRepository extends ServiceSupport implements Infligh
}
@Override
- protected void doStart() throws Exception {
- }
-
- @Override
protected void doStop() throws Exception {
int count = size();
if (count > 0) {
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultManagementStrategy.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultManagementStrategy.java
index 43fca10..dad1658 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultManagementStrategy.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultManagementStrategy.java
@@ -103,9 +103,6 @@ public class DefaultManagementStrategy extends ServiceSupport implements Managem
@Override
public ManagementObjectNameStrategy getManagementObjectNameStrategy() {
- if (managementObjectNameStrategy == null) {
- managementObjectNameStrategy = createManagementObjectNameStrategy(null);
- }
return managementObjectNameStrategy;
}
@@ -116,9 +113,6 @@ public class DefaultManagementStrategy extends ServiceSupport implements Managem
@Override
public ManagementObjectStrategy getManagementObjectStrategy() {
- if (managementObjectStrategy == null) {
- managementObjectStrategy = createManagementObjectStrategy();
- }
return managementObjectStrategy;
}
@@ -186,47 +180,46 @@ public class DefaultManagementStrategy extends ServiceSupport implements Managem
}
@Override
- protected void doStart() throws Exception {
- LOG.info("JMX is disabled");
+ protected void doInit() throws Exception {
+ LOG.info("JMX is enabled");
ObjectHelper.notNull(getCamelContext(), "CamelContext", this);
if (!getEventNotifiers().isEmpty()) {
getCamelContext().adapt(ExtendedCamelContext.class).setEventNotificationApplicable(true);
}
-
- doStartManagementStrategy();
- }
-
- protected void doStartManagementStrategy() throws Exception {
- ObjectHelper.notNull(camelContext, "CamelContext");
-
for (EventNotifier notifier : eventNotifiers) {
-
// inject CamelContext if the service is aware
if (notifier instanceof CamelContextAware) {
CamelContextAware aware = (CamelContextAware) notifier;
aware.setCamelContext(camelContext);
}
+ }
+ ServiceHelper.initService(eventNotifiers, managementAgent);
- ServiceHelper.startService(notifier);
+ if (managementObjectStrategy == null) {
+ managementObjectStrategy = createManagementObjectStrategy();
+ }
+ if (managementObjectStrategy instanceof CamelContextAware) {
+ ((CamelContextAware) managementObjectStrategy).setCamelContext(getCamelContext());
}
- if (managementAgent != null) {
- ServiceHelper.startService(managementAgent);
- // set the naming strategy using the domain name from the agent
- if (managementObjectNameStrategy == null) {
- String domain = managementAgent.getMBeanObjectDomainName();
- managementObjectNameStrategy = createManagementObjectNameStrategy(domain);
- }
+ if (managementObjectNameStrategy == null) {
+ managementObjectNameStrategy = createManagementObjectNameStrategy();
}
if (managementObjectNameStrategy instanceof CamelContextAware) {
((CamelContextAware) managementObjectNameStrategy).setCamelContext(getCamelContext());
}
+ ServiceHelper.initService(managementObjectStrategy, managementObjectNameStrategy);
+ }
+
+ @Override
+ protected void doStart() throws Exception {
+ ServiceHelper.startService(eventNotifiers, managementAgent, managementObjectStrategy, managementObjectNameStrategy);
}
@Override
protected void doStop() throws Exception {
- ServiceHelper.stopService(managementAgent, eventNotifiers);
+ ServiceHelper.stopService(managementObjectNameStrategy, managementObjectStrategy, managementAgent, eventNotifiers);
}
protected ManagementObjectNameStrategy createManagementObjectNameStrategy(String domain) {
@@ -237,4 +230,9 @@ public class DefaultManagementStrategy extends ServiceSupport implements Managem
return null;
}
+ protected ManagementObjectNameStrategy createManagementObjectNameStrategy() {
+ String domain = managementAgent != null ? managementAgent.getMBeanObjectDomainName() : null;
+ return createManagementObjectNameStrategy(domain);
+ }
+
}
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultMessageHistoryFactory.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultMessageHistoryFactory.java
index eac990f..b9adef5 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultMessageHistoryFactory.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultMessageHistoryFactory.java
@@ -98,13 +98,4 @@ public class DefaultMessageHistoryFactory extends ServiceSupport implements Mess
}
}
- @Override
- protected void doStart() throws Exception {
- // noop
- }
-
- @Override
- protected void doStop() throws Exception {
- // noop
- }
}
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultPackageScanClassResolver.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultPackageScanClassResolver.java
index bbd7c92..6df8d5e 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultPackageScanClassResolver.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultPackageScanClassResolver.java
@@ -450,11 +450,6 @@ public class DefaultPackageScanClassResolver extends BasePackageScanResolver imp
}
@Override
- protected void doStart() throws Exception {
- // noop
- }
-
- @Override
protected void doStop() throws Exception {
clearCache();
}
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultPackageScanResourceResolver.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultPackageScanResourceResolver.java
index f814af6..7c7fef0 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultPackageScanResourceResolver.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultPackageScanResourceResolver.java
@@ -300,7 +300,7 @@ public class DefaultPackageScanResourceResolver extends BasePackageScanResolver
}
@Override
- protected void doStart() throws Exception {
+ protected void doInit() throws Exception {
ObjectHelper.notNull(getCamelContext(), "CamelContext", this);
}
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 1db1029..d8da3c0 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
@@ -355,22 +355,30 @@ public class DefaultProducerCache extends ServiceSupport implements ProducerCach
}
@Override
- protected void doStart() throws Exception {
+ protected void doInit() throws Exception {
if (extendedStatistics) {
int max = maxCacheSize == 0 ? CamelContextHelper.getMaximumCachePoolSize(camelContext) : maxCacheSize;
statistics = new DefaultEndpointUtilizationStatistics(max);
}
-
- ServiceHelper.startService(producers, statistics);
+ ServiceHelper.initService(producers);
}
@Override
- protected void doStop() throws Exception {
- // when stopping we intend to shutdown
- ServiceHelper.stopAndShutdownServices(statistics, producers);
+ protected void doStart() throws Exception {
if (statistics != null) {
statistics.clear();
}
+ ServiceHelper.startService(producers);
+ }
+
+ @Override
+ protected void doStop() throws Exception {
+ ServiceHelper.stopService(producers);
+ }
+
+ @Override
+ protected void doShutdown() throws Exception {
+ ServiceHelper.stopAndShutdownServices(producers);
}
@Override
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultProducerTemplate.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultProducerTemplate.java
index d4bdd1e..02fcbc6 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultProducerTemplate.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultProducerTemplate.java
@@ -777,51 +777,50 @@ public class DefaultProducerTemplate extends ServiceSupport implements ProducerT
if (!isStarted()) {
throw new IllegalStateException("ProducerTemplate has not been started");
}
-
- if (executor != null) {
- return executor;
- }
-
- // create a default executor which must be synchronized
- synchronized (this) {
- if (executor != null) {
- return executor;
- }
- if (!threadedAsyncMode) {
- executor = new SynchronousExecutorService();
- } else {
- executor = camelContext.getExecutorServiceManager().newDefaultThreadPool(this, "ProducerTemplate");
+ if (executor == null) {
+ // create a default executor which must be synchronized
+ synchronized (lock) {
+ if (executor == null) {
+ if (threadedAsyncMode) {
+ executor = camelContext.getExecutorServiceManager().newDefaultThreadPool(this, "ProducerTemplate");
+ ObjectHelper.notNull(executor, "ExecutorService");
+ } else {
+ executor = new SynchronousExecutorService();
+ }
+ }
}
}
-
- ObjectHelper.notNull(executor, "ExecutorService");
return executor;
}
@Override
- protected void doStart() throws Exception {
- if (producerCache == null) {
- producerCache = new DefaultProducerCache(this, camelContext, maximumCacheSize);
- producerCache.setEventNotifierEnabled(isEventNotifierEnabled());
- }
-
+ protected void doInit() throws Exception {
// need to lookup default endpoint as it may have been intercepted
if (defaultEndpoint != null) {
defaultEndpoint = camelContext.getEndpoint(defaultEndpoint.getEndpointUri());
}
+ producerCache = new DefaultProducerCache(this, camelContext, maximumCacheSize);
+ producerCache.setEventNotifierEnabled(isEventNotifierEnabled());
+ ServiceHelper.initService(producerCache);
+ }
+ @Override
+ protected void doStart() throws Exception {
ServiceHelper.startService(producerCache);
}
@Override
protected void doStop() throws Exception {
ServiceHelper.stopService(producerCache);
- producerCache = null;
-
if (executor != null) {
camelContext.getExecutorServiceManager().shutdownNow(executor);
executor = null;
}
}
+ @Override
+ protected void doShutdown() throws Exception {
+ ServiceHelper.stopAndShutdownService(producerCache);
+ producerCache = null;
+ }
}
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultReactiveExecutor.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultReactiveExecutor.java
index dbba46e..406e21f 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultReactiveExecutor.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultReactiveExecutor.java
@@ -86,11 +86,6 @@ public class DefaultReactiveExecutor extends ServiceSupport implements ReactiveE
}
@Override
- protected void doStart() throws Exception {
- // noop
- }
-
- @Override
protected void doStop() throws Exception {
if (LOG.isDebugEnabled()) {
LOG.debug("Stopping DefaultReactiveExecutor [createdWorkers: {}, runningWorkers: {}, pendingTasks: {}]",
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultRoute.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultRoute.java
index d464456..b5a91ac 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultRoute.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultRoute.java
@@ -212,8 +212,6 @@ public class DefaultRoute extends ServiceSupport implements Route {
@Override
protected void doShutdown() throws Exception {
- // and clear start date
- startDate = null;
// clear services when shutting down
services.clear();
}
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultRouteController.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultRouteController.java
index 11d4eba..b0a3891 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultRouteController.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultRouteController.java
@@ -53,20 +53,6 @@ public class DefaultRouteController extends ServiceSupport implements RouteContr
}
// ***************************************************
- // Life cycle
- // ***************************************************
-
- @Override
- protected void doStart() throws Exception {
- // noop
- }
-
- @Override
- protected void doStop() throws Exception {
- // noop
- }
-
- // ***************************************************
// Route management
// ***************************************************
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultRuntimeEndpointRegistry.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultRuntimeEndpointRegistry.java
index 956c4726..0a1b851 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultRuntimeEndpointRegistry.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultRuntimeEndpointRegistry.java
@@ -186,7 +186,7 @@ public class DefaultRuntimeEndpointRegistry extends EventNotifierSupport impleme
}
@Override
- protected void doStart() throws Exception {
+ protected void doInit() throws Exception {
ObjectHelper.notNull(camelContext, "camelContext", this);
if (inputs == null) {
@@ -207,6 +207,11 @@ public class DefaultRuntimeEndpointRegistry extends EventNotifierSupport impleme
} else {
LOG.info("Runtime endpoint registry is in normal mode gathering information of all incoming and outgoing endpoints (cache limit: {})", limit);
}
+ ServiceHelper.initService(inputUtilization, outputUtilization);
+ }
+
+ @Override
+ protected void doStart() throws Exception {
ServiceHelper.startService(inputUtilization, outputUtilization);
}
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/event/CamelContextInitializedEvent.java b/core/camel-base/src/main/java/org/apache/camel/impl/event/CamelContextInitializedEvent.java
new file mode 100644
index 0000000..a277459
--- /dev/null
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/event/CamelContextInitializedEvent.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.impl.event;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.CamelEvent;
+
+public class CamelContextInitializedEvent extends AbstractContextEvent implements CamelEvent.CamelContextStartingEvent {
+ private static final long serialVersionUID = -3416082218670845373L;
+
+ public CamelContextInitializedEvent(CamelContext source) {
+ super(source);
+ }
+
+ @Override
+ public String toString() {
+ return "Initialized CamelContext: " + getContext().getName();
+ }
+}
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/event/CamelContextInitializingEvent.java b/core/camel-base/src/main/java/org/apache/camel/impl/event/CamelContextInitializingEvent.java
new file mode 100644
index 0000000..9674817
--- /dev/null
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/event/CamelContextInitializingEvent.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.impl.event;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.CamelEvent;
+
+public class CamelContextInitializingEvent extends AbstractContextEvent implements CamelEvent.CamelContextStartingEvent {
+ private static final long serialVersionUID = 3931186946570864733L;
+
+ public CamelContextInitializingEvent(CamelContext source) {
+ super(source);
+ }
+
+ @Override
+ public String toString() {
+ return "Initializing CamelContext: " + getContext().getName();
+ }
+}
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/event/DefaultEventFactory.java b/core/camel-base/src/main/java/org/apache/camel/impl/event/DefaultEventFactory.java
index 7729788..3b2f22f 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/event/DefaultEventFactory.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/event/DefaultEventFactory.java
@@ -31,6 +31,16 @@ import org.apache.camel.spi.EventFactory;
public class DefaultEventFactory implements EventFactory {
@Override
+ public CamelEvent createCamelContextInitializingEvent(CamelContext context) {
+ return new CamelContextInitializingEvent(context);
+ }
+
+ @Override
+ public CamelEvent createCamelContextInitializedEvent(CamelContext context) {
+ return new CamelContextInitializedEvent(context);
+ }
+
+ @Override
public CamelEvent createCamelContextStartingEvent(CamelContext context) {
return new CamelContextStartingEvent(context);
}
diff --git a/core/camel-base/src/main/java/org/apache/camel/processor/RemovePropertiesProcessor.java b/core/camel-base/src/main/java/org/apache/camel/processor/RemovePropertiesProcessor.java
index 042571a..8dffb58 100644
--- a/core/camel-base/src/main/java/org/apache/camel/processor/RemovePropertiesProcessor.java
+++ b/core/camel-base/src/main/java/org/apache/camel/processor/RemovePropertiesProcessor.java
@@ -87,13 +87,4 @@ public class RemovePropertiesProcessor extends AsyncProcessorSupport implements
return excludePattern;
}
- @Override
- protected void doStart() throws Exception {
- // noop
- }
-
- @Override
- protected void doStop() throws Exception {
- // noop
- }
}
\ No newline at end of file
diff --git a/core/camel-base/src/main/java/org/apache/camel/processor/interceptor/DefaultDebugger.java b/core/camel-base/src/main/java/org/apache/camel/processor/interceptor/DefaultDebugger.java
index 319dc8e..4fb6cf2 100644
--- a/core/camel-base/src/main/java/org/apache/camel/processor/interceptor/DefaultDebugger.java
+++ b/core/camel-base/src/main/java/org/apache/camel/processor/interceptor/DefaultDebugger.java
@@ -331,7 +331,7 @@ public class DefaultDebugger extends ServiceSupport implements Debugger, CamelCo
}
@Override
- protected void doStart() throws Exception {
+ protected void doInit() throws Exception {
ObjectHelper.notNull(camelContext, "CamelContext", this);
// must have message history enabled when using this debugger
@@ -340,8 +340,14 @@ public class DefaultDebugger extends ServiceSupport implements Debugger, CamelCo
}
// register our event notifier
- ServiceHelper.startService(debugEventNotifier);
camelContext.getManagementStrategy().addEventNotifier(debugEventNotifier);
+
+ ServiceHelper.initService(debugEventNotifier);
+ }
+
+ @Override
+ protected void doStart() throws Exception {
+ ServiceHelper.startService(debugEventNotifier);
}
@Override
diff --git a/core/camel-base/src/main/java/org/apache/camel/processor/loadbalancer/LoadBalancerSupport.java b/core/camel-base/src/main/java/org/apache/camel/processor/loadbalancer/LoadBalancerSupport.java
index d098969..590bc46 100644
--- a/core/camel-base/src/main/java/org/apache/camel/processor/loadbalancer/LoadBalancerSupport.java
+++ b/core/camel-base/src/main/java/org/apache/camel/processor/loadbalancer/LoadBalancerSupport.java
@@ -112,6 +112,11 @@ public abstract class LoadBalancerSupport extends AsyncProcessorSupport implemen
}
@Override
+ protected void doInit() throws Exception {
+ ServiceHelper.initService((Object[]) processors.get());
+ }
+
+ @Override
protected void doStart() throws Exception {
ServiceHelper.startService((Object[]) processors.get());
}
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/builder/AdviceWithRouteBuilder.java b/core/camel-core-engine/src/main/java/org/apache/camel/builder/AdviceWithRouteBuilder.java
index 15a0077..4b15319 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/builder/AdviceWithRouteBuilder.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/builder/AdviceWithRouteBuilder.java
@@ -26,6 +26,7 @@ import org.apache.camel.impl.engine.InterceptSendToMockEndpointStrategy;
import org.apache.camel.model.ModelCamelContext;
import org.apache.camel.model.ProcessorDefinition;
import org.apache.camel.model.RouteDefinition;
+import org.apache.camel.reifier.RouteReifier;
import org.apache.camel.support.EndpointHelper;
import org.apache.camel.support.PatternHelper;
import org.apache.camel.util.ObjectHelper;
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/builder/NotifyBuilder.java b/core/camel-core-engine/src/main/java/org/apache/camel/builder/NotifyBuilder.java
index c70a64e..a839dc7 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/builder/NotifyBuilder.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/builder/NotifyBuilder.java
@@ -96,7 +96,8 @@ public class NotifyBuilder {
this.context = context;
eventNotifier = new ExchangeNotifier();
try {
- ServiceHelper.startService(eventNotifier);
+ context.addService(eventNotifier, false);
+ eventNotifier.start();
} catch (Exception e) {
throw RuntimeCamelException.wrapRuntimeCamelException(e);
}
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightCamelContext.java b/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightCamelContext.java
index 5a0a9f5..21919db 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightCamelContext.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightCamelContext.java
@@ -147,12 +147,14 @@ public class LightweightCamelContext implements ExtendedCamelContext, CatalogCam
* Use one of the other constructors to force use an explicit registry.
*/
public LightweightCamelContext() {
- delegate = new DefaultCamelContext(false) {
+ DefaultCamelContext d = new DefaultCamelContext(false) {
@Override
public CamelContext getCamelContextReference() {
return LightweightCamelContext.this;
}
};
+ delegate = d;
+ d.build();
}
/**
@@ -217,6 +219,11 @@ public class LightweightCamelContext implements ExtendedCamelContext, CatalogCam
}
@Override
+ public void build() {
+ delegate.build();
+ }
+
+ @Override
public void init() {
delegate.init();
}
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightRuntimeCamelContext.java b/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightRuntimeCamelContext.java
index 8971d9c..2e616ab 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightRuntimeCamelContext.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightRuntimeCamelContext.java
@@ -267,6 +267,11 @@ public class LightweightRuntimeCamelContext implements ExtendedCamelContext, Cat
}
@Override
+ public void build() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
public void init() {
throw new UnsupportedOperationException();
}
@@ -288,6 +293,11 @@ public class LightweightRuntimeCamelContext implements ExtendedCamelContext, Cat
for (Route route : routes) {
route.getConsumer().start();
}
+ if (LOG.isInfoEnabled()) {
+ long l = System.currentTimeMillis() - startDate.getTime();
+ LOG.info("Apache Camel {} (CamelContext: {}) {} routes started in {}",
+ getVersion(), getName(), routes.size(), TimeUtils.printDuration(l));
+ }
}
@Override
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 6cfb14f..9752c5b 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
@@ -410,8 +410,6 @@ public abstract class AbstractCamelContextFactoryBean<T extends ModelCamelContex
// init stream caching strategy
initStreamCachingStrategy();
-
- getContext().init();
}
//CHECKSTYLE:ON
diff --git a/core/camel-core/src/test/java/org/apache/camel/ContextTestSupport.java b/core/camel-core/src/test/java/org/apache/camel/ContextTestSupport.java
index d641d62..49029e0 100644
--- a/core/camel-core/src/test/java/org/apache/camel/ContextTestSupport.java
+++ b/core/camel-core/src/test/java/org/apache/camel/ContextTestSupport.java
@@ -106,10 +106,18 @@ public abstract class ContextTestSupport extends TestSupport {
throw new Exception("Context must be a ModelCamelContext");
}
assertValidContext(context);
- context.init();
- // reduce default shutdown timeout to avoid waiting for 300 seconds
- context.getShutdownStrategy().setTimeout(10);
+ if (isUseRouteBuilder()) {
+ RouteBuilder[] builders = createRouteBuilders();
+ for (RouteBuilder builder : builders) {
+ log.debug("Using created route builder: {}", builder);
+ context.addRoutes(builder);
+ }
+ context.init();
+ } else {
+ log.debug("isUseRouteBuilder() is false");
+ }
+
template = context.createProducerTemplate();
template.start();
@@ -121,16 +129,11 @@ public abstract class ContextTestSupport extends TestSupport {
oneExchangeDone = event().whenDone(1).create();
if (isUseRouteBuilder()) {
- RouteBuilder[] builders = createRouteBuilders();
- for (RouteBuilder builder : builders) {
- log.debug("Using created route builder: {}", builder);
- context.addRoutes(builder);
- }
startCamelContext();
- } else {
- log.debug("isUseRouteBuilder() is false");
}
+ // reduce default shutdown timeout to avoid waiting for 300 seconds
+ context.getShutdownStrategy().setTimeout(10);
}
@Override
@@ -202,7 +205,7 @@ public abstract class ContextTestSupport extends TestSupport {
ctx.setRegistry(createRegistry());
context = ctx;
} else {
- DefaultCamelContext ctx = new DefaultCamelContext(false);
+ DefaultCamelContext ctx = new DefaultCamelContext(true);
ctx.setRegistry(createRegistry());
context = ctx;
}
diff --git a/core/camel-core/src/test/java/org/apache/camel/builder/BuilderWithScopesTest.java b/core/camel-core/src/test/java/org/apache/camel/builder/BuilderWithScopesTest.java
index 35f58f4..24a3e14 100644
--- a/core/camel-core/src/test/java/org/apache/camel/builder/BuilderWithScopesTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/builder/BuilderWithScopesTest.java
@@ -89,7 +89,7 @@ public class BuilderWithScopesTest extends TestSupport {
order.clear();
DefaultCamelContext container = new DefaultCamelContext(false);
container.disableJMX();
- container.init();
+ container.build();
container.addRoutes(builder);
container.start();
diff --git a/core/camel-core/src/test/java/org/apache/camel/impl/MultipleLifecycleStrategyTest.java b/core/camel-core/src/test/java/org/apache/camel/impl/MultipleLifecycleStrategyTest.java
index 7a34a4c..bdb5fa1 100644
--- a/core/camel-core/src/test/java/org/apache/camel/impl/MultipleLifecycleStrategyTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/impl/MultipleLifecycleStrategyTest.java
@@ -48,9 +48,11 @@ public class MultipleLifecycleStrategyTest extends TestSupport {
context.removeComponent("log");
context.stop();
- List<String> expectedEvents = Arrays.asList("onContextStart",
- "onServiceAdd", "onServiceAdd", "onServiceAdd", "onServiceAdd", "onServiceAdd",
+ List<String> expectedEvents = Arrays.asList(
+ "onServiceAdd", "onServiceAdd",
"onServiceAdd", "onServiceAdd", "onServiceAdd", "onServiceAdd", "onServiceAdd",
+ "onServiceAdd", "onServiceAdd", "onServiceAdd", "onServiceAdd",
+ "onContextStart",
"onComponentAdd", "onEndpointAdd", "onComponentRemove", "onContextStop");
assertEquals(expectedEvents, dummy1.getEvents());
diff --git a/core/camel-core/src/test/java/org/apache/camel/issues/SentExchangeEventNotifierIssueTest.java b/core/camel-core/src/test/java/org/apache/camel/issues/SentExchangeEventNotifierIssueTest.java
index 5b6635b..de4d5c6 100644
--- a/core/camel-core/src/test/java/org/apache/camel/issues/SentExchangeEventNotifierIssueTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/issues/SentExchangeEventNotifierIssueTest.java
@@ -57,7 +57,6 @@ public class SentExchangeEventNotifierIssueTest extends ContextTestSupport {
@Override
protected CamelContext createCamelContext() throws Exception {
CamelContext context = super.createCamelContext();
- context.init();
context.getManagementStrategy().addEventNotifier(notifier);
return context;
}
diff --git a/core/camel-core/src/test/java/org/apache/camel/issues/SentExchangeEventNotifierTwoIssueTest.java b/core/camel-core/src/test/java/org/apache/camel/issues/SentExchangeEventNotifierTwoIssueTest.java
index 81ccbe1..5f1f1c8 100644
--- a/core/camel-core/src/test/java/org/apache/camel/issues/SentExchangeEventNotifierTwoIssueTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/issues/SentExchangeEventNotifierTwoIssueTest.java
@@ -57,7 +57,6 @@ public class SentExchangeEventNotifierTwoIssueTest extends ContextTestSupport {
@Override
protected CamelContext createCamelContext() throws Exception {
CamelContext context = super.createCamelContext();
- context.init();
context.getManagementStrategy().addEventNotifier(notifier);
return context;
}
diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/EventNotifierExchangeSentExampleTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/EventNotifierExchangeSentExampleTest.java
index 0c79526..0c99012 100644
--- a/core/camel-core/src/test/java/org/apache/camel/processor/EventNotifierExchangeSentExampleTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/processor/EventNotifierExchangeSentExampleTest.java
@@ -27,7 +27,6 @@ public class EventNotifierExchangeSentExampleTest extends ContextTestSupport {
@Override
protected CamelContext createCamelContext() throws Exception {
DefaultCamelContext context = (DefaultCamelContext)super.createCamelContext();
- context.init();
// START SNIPPET: e1
// add event notifier where we can log the times it took to process
diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/ProducerTemplateDisableEventNotifierTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/ProducerTemplateDisableEventNotifierTest.java
index c6a9b89..9d53fc2 100644
--- a/core/camel-core/src/test/java/org/apache/camel/processor/ProducerTemplateDisableEventNotifierTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/processor/ProducerTemplateDisableEventNotifierTest.java
@@ -30,7 +30,6 @@ public class ProducerTemplateDisableEventNotifierTest extends ContextTestSupport
@Override
protected CamelContext createCamelContext() throws Exception {
DefaultCamelContext context = (DefaultCamelContext)super.createCamelContext();
- context.init();
context.getManagementStrategy().addEventNotifier(notifier);
return context;
}
diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/SplitterUseOriginalNotPropagateExceptionTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/SplitterUseOriginalNotPropagateExceptionTest.java
index 48948ba..93c07ed 100644
--- a/core/camel-core/src/test/java/org/apache/camel/processor/SplitterUseOriginalNotPropagateExceptionTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/processor/SplitterUseOriginalNotPropagateExceptionTest.java
@@ -32,7 +32,6 @@ public class SplitterUseOriginalNotPropagateExceptionTest extends ContextTestSup
@Override
protected CamelContext createCamelContext() throws Exception {
CamelContext context = super.createCamelContext();
- context.init();
context.getManagementStrategy().addEventNotifier(notifier);
return context;
}
diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/enricher/EnricherAsyncUnhandledExceptionTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/enricher/EnricherAsyncUnhandledExceptionTest.java
index 59160aa..7af0e97 100644
--- a/core/camel-core/src/test/java/org/apache/camel/processor/enricher/EnricherAsyncUnhandledExceptionTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/processor/enricher/EnricherAsyncUnhandledExceptionTest.java
@@ -66,7 +66,6 @@ public class EnricherAsyncUnhandledExceptionTest extends ContextTestSupport {
@Override
protected CamelContext createCamelContext() throws Exception {
CamelContext camelContext = super.createCamelContext();
- camelContext.init();
ShutdownStrategy shutdownStrategy = camelContext.getShutdownStrategy();
camelContext.addComponent("async", new MyAsyncComponent());
shutdownStrategy.setTimeout(1000);
diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/enricher/EnricherSendEventTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/enricher/EnricherSendEventTest.java
index 47fb180..3a77bda 100644
--- a/core/camel-core/src/test/java/org/apache/camel/processor/enricher/EnricherSendEventTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/processor/enricher/EnricherSendEventTest.java
@@ -53,7 +53,6 @@ public class EnricherSendEventTest extends ContextTestSupport {
@Override
protected CamelContext createCamelContext() throws Exception {
CamelContext camelContext = super.createCamelContext();
- camelContext.init();
ShutdownStrategy shutdownStrategy = camelContext.getShutdownStrategy();
camelContext.addComponent("async", new MyAsyncComponent());
diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/routingslip/DynamicRouterEventNotifierTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/routingslip/DynamicRouterEventNotifierTest.java
index fe5835b..7b49930 100644
--- a/core/camel-core/src/test/java/org/apache/camel/processor/routingslip/DynamicRouterEventNotifierTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/processor/routingslip/DynamicRouterEventNotifierTest.java
@@ -35,7 +35,6 @@ public class DynamicRouterEventNotifierTest extends ContextTestSupport {
@Override
protected CamelContext createCamelContext() throws Exception {
CamelContext context = super.createCamelContext();
- context.init();
context.getManagementStrategy().addEventNotifier(notifier);
return context;
}
diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/routingslip/RecipientListEventNotifierTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/routingslip/RecipientListEventNotifierTest.java
index 8cbcbac..fe6278d 100644
--- a/core/camel-core/src/test/java/org/apache/camel/processor/routingslip/RecipientListEventNotifierTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/processor/routingslip/RecipientListEventNotifierTest.java
@@ -32,7 +32,6 @@ public class RecipientListEventNotifierTest extends ContextTestSupport {
@Override
protected CamelContext createCamelContext() throws Exception {
CamelContext context = super.createCamelContext();
- context.init();
context.getManagementStrategy().addEventNotifier(notifier);
return context;
}
diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/routingslip/RoutingSlipEventNotifierTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/routingslip/RoutingSlipEventNotifierTest.java
index 922c2b4..0fe3d31 100644
--- a/core/camel-core/src/test/java/org/apache/camel/processor/routingslip/RoutingSlipEventNotifierTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/processor/routingslip/RoutingSlipEventNotifierTest.java
@@ -32,7 +32,6 @@ public class RoutingSlipEventNotifierTest extends ContextTestSupport {
@Override
protected CamelContext createCamelContext() throws Exception {
CamelContext context = super.createCamelContext();
- context.init();
context.getManagementStrategy().addEventNotifier(notifier);
return context;
}
diff --git a/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java b/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java
index 2493155..1679fcf 100644
--- a/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java
+++ b/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java
@@ -595,7 +595,7 @@ public abstract class BaseMainSupport extends BaseService {
protected void postProcessCamelContext(CamelContext camelContext) throws Exception {
// ensure camel is initialized
- camelContext.init();
+ camelContext.build();
configurePropertiesService(camelContext);
diff --git a/core/camel-management/src/main/java/org/apache/camel/management/DefaultManagementAgent.java b/core/camel-management/src/main/java/org/apache/camel/management/DefaultManagementAgent.java
index 2a165cf..5d2d635 100644
--- a/core/camel-management/src/main/java/org/apache/camel/management/DefaultManagementAgent.java
+++ b/core/camel-management/src/main/java/org/apache/camel/management/DefaultManagementAgent.java
@@ -428,20 +428,26 @@ public class DefaultManagementAgent extends ServiceSupport implements Management
}
@Override
- protected void doStart() throws Exception {
+ protected void doInit() throws Exception {
ObjectHelper.notNull(camelContext, "CamelContext");
+ finalizeSettings();
+
+ assembler = camelContext.adapt(ExtendedCamelContext.class).getManagementMBeanAssembler();
+ if (assembler == null) {
+ assembler = new DefaultManagementMBeanAssembler(camelContext);
+ }
+ ServiceHelper.initService(assembler);
+ }
+
+ @Override
+ protected void doStart() throws Exception {
// create mbean server if is has not be injected.
if (server == null) {
- finalizeSettings();
createMBeanServer();
}
// ensure assembler is started
- assembler = camelContext.adapt(ExtendedCamelContext.class).getManagementMBeanAssembler();
- if (assembler == null) {
- assembler = new DefaultManagementMBeanAssembler(camelContext);
- }
ServiceHelper.startService(assembler);
LOG.debug("Starting JMX agent on server: {}", getMBeanServer());
diff --git a/core/camel-management/src/main/java/org/apache/camel/management/JmxManagementLifecycleStrategy.java b/core/camel-management/src/main/java/org/apache/camel/management/JmxManagementLifecycleStrategy.java
index eb9e61c..48a9d0b 100644
--- a/core/camel-management/src/main/java/org/apache/camel/management/JmxManagementLifecycleStrategy.java
+++ b/core/camel-management/src/main/java/org/apache/camel/management/JmxManagementLifecycleStrategy.java
@@ -125,7 +125,7 @@ public class JmxManagementLifecycleStrategy extends ServiceSupport implements Li
// the wrapped processors is for performance counters, which are in use for the created routes
// when a route is removed, we should remove the associated processors from this map
private final Map<Processor, KeyValueHolder<NamedNode, InstrumentationProcessor>> wrappedProcessors = new HashMap<>();
- private final List<PreRegisterService> preServices = new ArrayList<>();
+ private final List<java.util.function.Consumer<JmxManagementLifecycleStrategy>> preServices = new ArrayList<>();
private final TimerListenerManager loadTimer = new ManagedLoadTimer();
private final TimerListenerManagerStartupListener loadTimerStartupListener = new TimerListenerManagerStartupListener();
private volatile CamelContext camelContext;
@@ -145,13 +145,13 @@ public class JmxManagementLifecycleStrategy extends ServiceSupport implements Li
// used for handing over pre-services between a provisional lifecycycle strategy
// and then later the actual strategy to be used when using XML
- List<PreRegisterService> getPreServices() {
+ List<java.util.function.Consumer<JmxManagementLifecycleStrategy>> getPreServices() {
return preServices;
}
// used for handing over pre-services between a provisional lifecycycle strategy
// and then later the actual strategy to be used when using XML
- void addPreService(PreRegisterService preService) {
+ void addPreService(java.util.function.Consumer<JmxManagementLifecycleStrategy> preService) {
preServices.add(preService);
}
@@ -216,6 +216,9 @@ public class JmxManagementLifecycleStrategy extends ServiceSupport implements Li
// set the name we are going to use
context.setManagementName(managementName);
+ // yes we made it and are initialized
+ initialized = true;
+
try {
manageObject(mc);
} catch (Exception e) {
@@ -224,9 +227,6 @@ public class JmxManagementLifecycleStrategy extends ServiceSupport implements Li
throw RuntimeCamelException.wrapRuntimeCamelException(e);
}
- // yes we made it and are initialized
- initialized = true;
-
if (mc instanceof ManagedCamelContext) {
camelContextMBean = (ManagedCamelContext) mc;
}
@@ -293,14 +293,8 @@ public class JmxManagementLifecycleStrategy extends ServiceSupport implements Li
}
LOG.debug("Registering {} pre registered services", preServices.size());
- for (PreRegisterService pre : preServices) {
- if (pre.getComponent() != null) {
- onComponentAdd(pre.getName(), pre.getComponent());
- } else if (pre.getEndpoint() != null) {
- onEndpointAdd(pre.getEndpoint());
- } else if (pre.getService() != null) {
- onServiceAdd(pre.getCamelContext(), pre.getService(), pre.getRoute());
- }
+ for (java.util.function.Consumer<JmxManagementLifecycleStrategy> pre : preServices) {
+ pre.accept(this);
}
// we are done so clear the list
@@ -352,9 +346,7 @@ public class JmxManagementLifecycleStrategy extends ServiceSupport implements Li
// always register components as there are only a few of those
if (!initialized) {
// pre register so we can register later when we have been initialized
- PreRegisterService pre = new PreRegisterService();
- pre.onComponentAdd(name, component);
- preServices.add(pre);
+ preServices.add(lf -> lf.onComponentAdd(name, component));
return;
}
try {
@@ -390,9 +382,7 @@ public class JmxManagementLifecycleStrategy extends ServiceSupport implements Li
public void onEndpointAdd(Endpoint endpoint) {
if (!initialized) {
// pre register so we can register later when we have been initialized
- PreRegisterService pre = new PreRegisterService();
- pre.onEndpointAdd(endpoint);
- preServices.add(pre);
+ preServices.add(lf -> lf.onEndpointAdd(endpoint));
return;
}
@@ -429,12 +419,10 @@ public class JmxManagementLifecycleStrategy extends ServiceSupport implements Li
}
@Override
- public void onServiceAdd(CamelContext context, Service service, org.apache.camel.Route route) {
+ public void onServiceAdd(CamelContext context, Service service, Route route) {
if (!initialized) {
// pre register so we can register later when we have been initialized
- PreRegisterService pre = new PreRegisterService();
- pre.onServiceAdd(context, service, route);
- preServices.add(pre);
+ preServices.add(lf -> lf.onServiceAdd(camelContext, service, route));
return;
}
@@ -466,7 +454,7 @@ public class JmxManagementLifecycleStrategy extends ServiceSupport implements Li
}
@Override
- public void onServiceRemove(CamelContext context, Service service, org.apache.camel.Route route) {
+ public void onServiceRemove(CamelContext context, Service service, Route route) {
// the agent hasn't been started
if (!initialized) {
return;
@@ -483,7 +471,7 @@ public class JmxManagementLifecycleStrategy extends ServiceSupport implements Li
}
@SuppressWarnings("unchecked")
- private Object getManagedObjectForService(CamelContext context, Service service, org.apache.camel.Route route) {
+ private Object getManagedObjectForService(CamelContext context, Service service, Route route) {
// skip channel, UoW and dont double wrap instrumentation
if (service instanceof Channel || service instanceof UnitOfWork || service instanceof InstrumentationProcessor) {
return null;
@@ -575,7 +563,7 @@ public class JmxManagementLifecycleStrategy extends ServiceSupport implements Li
return answer;
}
- private Object getManagedObjectForProcessor(CamelContext context, Processor processor, org.apache.camel.Route route) {
+ private Object getManagedObjectForProcessor(CamelContext context, Processor processor, Route route) {
// a bit of magic here as the processors we want to manage have already been registered
// in the wrapped processors map when Camel have instrumented the route on route initialization
// so the idea is now to only manage the processors from the map
@@ -603,8 +591,8 @@ public class JmxManagementLifecycleStrategy extends ServiceSupport implements Li
}
@Override
- public void onRoutesAdd(Collection<org.apache.camel.Route> routes) {
- for (org.apache.camel.Route route : routes) {
+ public void onRoutesAdd(Collection<Route> routes) {
+ for (Route route : routes) {
// if we are starting CamelContext or either of the two options has been
// enabled, then enlist the route as a known route
@@ -658,13 +646,13 @@ public class JmxManagementLifecycleStrategy extends ServiceSupport implements Li
}
@Override
- public void onRoutesRemove(Collection<org.apache.camel.Route> routes) {
+ public void onRoutesRemove(Collection<Route> routes) {
// the agent hasn't been started
if (!initialized) {
return;
}
- for (org.apache.camel.Route route : routes) {
+ for (Route route : routes) {
Object mr = getManagementObjectStrategy().getManagedObjectForRoute(camelContext, route);
// skip unmanaged routes
@@ -690,6 +678,12 @@ public class JmxManagementLifecycleStrategy extends ServiceSupport implements Li
@Override
public void onErrorHandlerAdd(Route route, Processor errorHandler, ErrorHandlerFactory errorHandlerBuilder) {
+ if (!initialized) {
+ // pre register so we can register later when we have been initialized
+ preServices.add(lf -> lf.onErrorHandlerAdd(route, errorHandler, errorHandlerBuilder));
+ return;
+ }
+
if (!shouldRegister(errorHandler, null)) {
// avoid registering if not needed
return;
@@ -730,6 +724,12 @@ public class JmxManagementLifecycleStrategy extends ServiceSupport implements Li
public void onThreadPoolAdd(CamelContext camelContext, ThreadPoolExecutor threadPool, String id,
String sourceId, String routeId, String threadPoolProfileId) {
+ if (!initialized) {
+ // pre register so we can register later when we have been initialized
+ preServices.add(lf -> lf.onThreadPoolAdd(camelContext, threadPool, id, sourceId, routeId, threadPoolProfileId));
+ return;
+ }
+
if (!shouldRegister(threadPool, null)) {
// avoid registering if not needed
return;
@@ -778,10 +778,6 @@ public class JmxManagementLifecycleStrategy extends ServiceSupport implements Li
@Override
public void onRouteContextCreate(Route route) {
- if (!initialized) {
- return;
- }
-
// Create a map (ProcessorType -> PerformanceCounter)
// to be passed to InstrumentationInterceptStrategy.
Map<NamedNode, PerformanceCounter> registeredCounters = new HashMap<>();
@@ -808,9 +804,9 @@ public class JmxManagementLifecycleStrategy extends ServiceSupport implements Li
*
* @param routes the routes
*/
- private void removeWrappedProcessorsForRoutes(Collection<org.apache.camel.Route> routes) {
+ private void removeWrappedProcessorsForRoutes(Collection<Route> routes) {
// loop the routes, and remove the route associated wrapped processors, as they are no longer in use
- for (org.apache.camel.Route route : routes) {
+ for (Route route : routes) {
String id = route.getId();
Iterator<KeyValueHolder<NamedNode, InstrumentationProcessor>> it = wrappedProcessors.values().iterator();
@@ -935,7 +931,7 @@ public class JmxManagementLifecycleStrategy extends ServiceSupport implements Li
* @param route an optional route the mbean is associated with, can be <tt>null</tt>
* @return <tt>true</tt> to register, <tt>false</tt> to skip registering
*/
- protected boolean shouldRegister(Object service, org.apache.camel.Route route) {
+ protected boolean shouldRegister(Object service, Route route) {
// the agent hasn't been started
if (!initialized) {
return false;
@@ -950,7 +946,8 @@ public class JmxManagementLifecycleStrategy extends ServiceSupport implements Li
}
// always register if we are starting CamelContext
- if (getCamelContext().getStatus().isStarting()) {
+ if (getCamelContext().getStatus().isStarting()
+ || getCamelContext().getStatus().isInitializing()) {
return true;
}
@@ -1029,7 +1026,15 @@ public class JmxManagementLifecycleStrategy extends ServiceSupport implements Li
private Endpoint endpoint;
private CamelContext camelContext;
private Service service;
- private org.apache.camel.Route route;
+ private Route route;
+ private java.util.function.Consumer<JmxManagementLifecycleStrategy> runnable;
+
+ public PreRegisterService() {
+ }
+
+ public PreRegisterService(java.util.function.Consumer<JmxManagementLifecycleStrategy> runnable) {
+ this.runnable = runnable;
+ }
public void onComponentAdd(String name, Component component) {
this.name = name;
@@ -1040,7 +1045,7 @@ public class JmxManagementLifecycleStrategy extends ServiceSupport implements Li
this.endpoint = endpoint;
}
- public void onServiceAdd(CamelContext camelContext, Service service, org.apache.camel.Route route) {
+ public void onServiceAdd(CamelContext camelContext, Service service, Route route) {
this.camelContext = camelContext;
this.service = service;
this.route = route;
@@ -1066,9 +1071,14 @@ public class JmxManagementLifecycleStrategy extends ServiceSupport implements Li
return service;
}
- public org.apache.camel.Route getRoute() {
+ public Route getRoute() {
return route;
}
+
+ public java.util.function.Consumer<JmxManagementLifecycleStrategy> getRunnable() {
+ return runnable;
+ }
+
}
}
diff --git a/core/camel-management/src/main/java/org/apache/camel/management/JmxManagementStrategy.java b/core/camel-management/src/main/java/org/apache/camel/management/JmxManagementStrategy.java
index 5829801..f492a64 100644
--- a/core/camel-management/src/main/java/org/apache/camel/management/JmxManagementStrategy.java
+++ b/core/camel-management/src/main/java/org/apache/camel/management/JmxManagementStrategy.java
@@ -30,6 +30,9 @@ import org.apache.camel.util.ObjectHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import java.util.ArrayList;
+import java.util.List;
+
/**
* A JMX capable {@link org.apache.camel.spi.ManagementStrategy} that Camel by default uses if possible.
* <p/>
@@ -42,6 +45,8 @@ public class JmxManagementStrategy extends DefaultManagementStrategy {
private static final Logger LOG = LoggerFactory.getLogger(JmxManagementStrategy.class);
+ private final List<Object> managed = new ArrayList<>();
+
public JmxManagementStrategy() {
}
@@ -53,6 +58,10 @@ public class JmxManagementStrategy extends DefaultManagementStrategy {
@Override
public void manageObject(Object managedObject) throws Exception {
+ if (!isStartingOrStarted()) {
+ managed.add(managedObject);
+ return;
+ }
ObjectName objectName = getManagementObjectNameStrategy().getObjectName(managedObject);
if (objectName != null) {
getManagementAgent().register(managedObject, objectName);
@@ -61,6 +70,10 @@ public class JmxManagementStrategy extends DefaultManagementStrategy {
@Override
public void unmanageObject(Object managedObject) throws Exception {
+ if (!isStartingOrStarted()) {
+ managed.remove(managedObject);
+ return;
+ }
ObjectName objectName = getManagementObjectNameStrategy().getObjectName(managedObject);
if (objectName != null) {
getManagementAgent().unregister(objectName);
@@ -99,14 +112,10 @@ public class JmxManagementStrategy extends DefaultManagementStrategy {
@Override
protected void doStart() throws Exception {
- LOG.info("JMX is enabled");
-
- ObjectHelper.notNull(getCamelContext(), "CamelContext", this);
- if (!getEventNotifiers().isEmpty()) {
- getCamelContext().adapt(ExtendedCamelContext.class).setEventNotificationApplicable(true);
+ super.doStart();
+ for (Object o : managed) {
+ manageObject(o);
}
-
- doStartManagementStrategy();
}
@Override
diff --git a/core/camel-management/src/main/java/org/apache/camel/management/JmxManagementStrategyFactory.java b/core/camel-management/src/main/java/org/apache/camel/management/JmxManagementStrategyFactory.java
index ef4f9e7..0bddc12 100644
--- a/core/camel-management/src/main/java/org/apache/camel/management/JmxManagementStrategyFactory.java
+++ b/core/camel-management/src/main/java/org/apache/camel/management/JmxManagementStrategyFactory.java
@@ -54,7 +54,7 @@ public class JmxManagementStrategyFactory implements ManagementStrategyFactory {
// a bit of ugly code to handover pre registered services that has been add to an eager/provisional JmxManagementLifecycleStrategy
// which is now re-placed with a new JmxManagementLifecycleStrategy that is based on the end user configured settings
// and therefore will be in use
- List<JmxManagementLifecycleStrategy.PreRegisterService> preServices = null;
+ List<java.util.function.Consumer<JmxManagementLifecycleStrategy>> preServices = null;
JmxManagementLifecycleStrategy jmx = camelContext.getLifecycleStrategies().stream()
.filter(s -> s instanceof JmxManagementLifecycleStrategy)
.map(JmxManagementLifecycleStrategy.class::cast)
@@ -65,7 +65,7 @@ public class JmxManagementStrategyFactory implements ManagementStrategyFactory {
if (preServices != null && !preServices.isEmpty() && lifecycle instanceof JmxManagementLifecycleStrategy) {
JmxManagementLifecycleStrategy existing = (JmxManagementLifecycleStrategy) lifecycle;
- for (JmxManagementLifecycleStrategy.PreRegisterService pre : preServices) {
+ for (java.util.function.Consumer<JmxManagementLifecycleStrategy> pre : preServices) {
existing.addPreService(pre);
}
}
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/JmxInstrumentationOnlyRegisterProcessorWithCustomIdTest.java b/core/camel-management/src/test/java/org/apache/camel/management/JmxInstrumentationOnlyRegisterProcessorWithCustomIdTest.java
index bb48c72..325eb49 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/JmxInstrumentationOnlyRegisterProcessorWithCustomIdTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/JmxInstrumentationOnlyRegisterProcessorWithCustomIdTest.java
@@ -73,7 +73,6 @@ public class JmxInstrumentationOnlyRegisterProcessorWithCustomIdTest extends Con
@Override
protected CamelContext createCamelContext() throws Exception {
CamelContext context = super.createCamelContext();
- context.init();
context.getManagementStrategy().getManagementAgent().setOnlyRegisterProcessorWithCustomId(true);
return context;
}
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedCamelContextPropertiesTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedCamelContextPropertiesTest.java
index 13bc1e8..51110d6 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/ManagedCamelContextPropertiesTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedCamelContextPropertiesTest.java
@@ -30,7 +30,6 @@ public class ManagedCamelContextPropertiesTest extends ManagementTestSupport {
@Override
protected CamelContext createCamelContext() throws Exception {
CamelContext context = super.createCamelContext();
- context.init();
// to force a different management name than the camel id
context.getManagementNameStrategy().setNamePattern("19-#name#");
return context;
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedCamelContextTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedCamelContextTest.java
index a1106cf..6830abe 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/ManagedCamelContextTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedCamelContextTest.java
@@ -34,7 +34,6 @@ public class ManagedCamelContextTest extends ManagementTestSupport {
@Override
protected CamelContext createCamelContext() throws Exception {
CamelContext context = super.createCamelContext();
- context.init();
// to force a different management name than the camel id
context.getManagementNameStrategy().setNamePattern("19-#name#");
return context;
@@ -42,7 +41,7 @@ public class ManagedCamelContextTest extends ManagementTestSupport {
@Test
public void testManagedCamelContextClient() throws Exception {
- // JMX tests dont work well on AIX CI servers (hangs them)
+ // JMX tests don't work well on AIX CI servers (hangs them)
if (isPlatform("aix")) {
return;
}
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedDynamicRouterTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedDynamicRouterTest.java
index 3b678c7..a5586a1 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/ManagedDynamicRouterTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedDynamicRouterTest.java
@@ -32,7 +32,6 @@ public class ManagedDynamicRouterTest extends ManagementTestSupport {
@Override
protected CamelContext createCamelContext() throws Exception {
CamelContext context = super.createCamelContext();
- context.init();
context.getManagementStrategy().getManagementAgent().setStatisticsLevel(ManagementStatisticsLevel.Extended);
return context;
}
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedEndpointUtilizationStatisticsTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedEndpointUtilizationStatisticsTest.java
index 1ce7489..4665b52 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/ManagedEndpointUtilizationStatisticsTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedEndpointUtilizationStatisticsTest.java
@@ -29,7 +29,6 @@ public class ManagedEndpointUtilizationStatisticsTest extends ManagementTestSupp
@Override
protected CamelContext createCamelContext() throws Exception {
CamelContext camelContext = super.createCamelContext();
- camelContext.init();
// turn on runtime statistics in extended mode
camelContext.getManagementStrategy().getManagementAgent().setStatisticsLevel(ManagementStatisticsLevel.Extended);
return camelContext;
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedEnricherTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedEnricherTest.java
index e564351..f138804 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/ManagedEnricherTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedEnricherTest.java
@@ -32,7 +32,6 @@ public class ManagedEnricherTest extends ManagementTestSupport {
@Override
protected CamelContext createCamelContext() throws Exception {
CamelContext context = super.createCamelContext();
- context.init();
context.getManagementStrategy().getManagementAgent().setStatisticsLevel(ManagementStatisticsLevel.Extended);
return context;
}
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedNamePatternFixedTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedNamePatternFixedTest.java
index f477a70..1ea5a0c 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/ManagedNamePatternFixedTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedNamePatternFixedTest.java
@@ -28,7 +28,6 @@ public class ManagedNamePatternFixedTest extends ManagementTestSupport {
@Override
protected CamelContext createCamelContext() throws Exception {
CamelContext context = super.createCamelContext();
- context.init();
context.getManagementNameStrategy().setNamePattern("cool");
return context;
}
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedNamePatternIncludeHostNameTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedNamePatternIncludeHostNameTest.java
index e8441a1..d0ab4b6 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/ManagedNamePatternIncludeHostNameTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedNamePatternIncludeHostNameTest.java
@@ -28,7 +28,7 @@ public class ManagedNamePatternIncludeHostNameTest extends ManagementTestSupport
@Override
protected CamelContext createCamelContext() throws Exception {
CamelContext context = super.createCamelContext();
- context.init();
+ context.getManagementStrategy().init();
DefaultManagementObjectNameStrategy naming = (DefaultManagementObjectNameStrategy)context.getManagementStrategy().getManagementObjectNameStrategy();
naming.setHostName("localhost");
context.getManagementStrategy().getManagementAgent().setIncludeHostName(true);
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedNamePatternTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedNamePatternTest.java
index 754cc5e..28209ef 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/ManagedNamePatternTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedNamePatternTest.java
@@ -28,7 +28,6 @@ public class ManagedNamePatternTest extends ManagementTestSupport {
@Override
protected CamelContext createCamelContext() throws Exception {
CamelContext context = super.createCamelContext();
- context.init();
context.getManagementNameStrategy().setNamePattern("cool-#name#");
return context;
}
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedNonManagedServiceTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedNonManagedServiceTest.java
index e9d545e..3642872 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/ManagedNonManagedServiceTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedNonManagedServiceTest.java
@@ -29,7 +29,7 @@ import org.junit.Test;
public class ManagedNonManagedServiceTest extends ManagementTestSupport {
- private static final int SERVICES = 10;
+ private static final int SERVICES = 11;
@Test
public void testService() throws Exception {
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedPollEnricherTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedPollEnricherTest.java
index 559f64f..e57cb34 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/ManagedPollEnricherTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedPollEnricherTest.java
@@ -32,7 +32,6 @@ public class ManagedPollEnricherTest extends ManagementTestSupport {
@Override
protected CamelContext createCamelContext() throws Exception {
CamelContext context = super.createCamelContext();
- context.init();
context.getManagementStrategy().getManagementAgent().setStatisticsLevel(ManagementStatisticsLevel.Extended);
return context;
}
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedProducerRecipientListRegisterAlwaysTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedProducerRecipientListRegisterAlwaysTest.java
index 168530e..d756ad0 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/ManagedProducerRecipientListRegisterAlwaysTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedProducerRecipientListRegisterAlwaysTest.java
@@ -31,7 +31,6 @@ public class ManagedProducerRecipientListRegisterAlwaysTest extends ManagementTe
@Override
protected CamelContext createCamelContext() throws Exception {
CamelContext context = super.createCamelContext();
- context.init();
context.getManagementStrategy().getManagementAgent().setRegisterAlways(true);
return context;
}
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedProducerRouteAddRemoveRegisterAlwaysTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedProducerRouteAddRemoveRegisterAlwaysTest.java
index dc68cdb..ac22496 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/ManagedProducerRouteAddRemoveRegisterAlwaysTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedProducerRouteAddRemoveRegisterAlwaysTest.java
@@ -28,12 +28,11 @@ import org.junit.Test;
public class ManagedProducerRouteAddRemoveRegisterAlwaysTest extends ManagementTestSupport {
- private static final int SERVICES = 10;
+ private static final int SERVICES = 11;
@Override
protected CamelContext createCamelContext() throws Exception {
CamelContext context = super.createCamelContext();
- context.init();
context.getManagementStrategy().getManagementAgent().setRegisterAlways(true);
return context;
}
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedRecipientListTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedRecipientListTest.java
index ca86746..2383634 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/ManagedRecipientListTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedRecipientListTest.java
@@ -32,7 +32,6 @@ public class ManagedRecipientListTest extends ManagementTestSupport {
@Override
protected CamelContext createCamelContext() throws Exception {
CamelContext context = super.createCamelContext();
- context.init();
context.getManagementStrategy().getManagementAgent().setStatisticsLevel(ManagementStatisticsLevel.Extended);
return context;
}
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedRouteAddRemoveTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedRouteAddRemoveTest.java
index 702ff39..fff6e2d 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/ManagedRouteAddRemoveTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedRouteAddRemoveTest.java
@@ -33,7 +33,7 @@ import org.junit.Test;
*/
public class ManagedRouteAddRemoveTest extends ManagementTestSupport {
- private static final int SERVICES = 10;
+ private static final int SERVICES = 11;
@Override
protected RouteBuilder createRouteBuilder() throws Exception {
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedRoutingSlipTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedRoutingSlipTest.java
index 7207f76..89ce72f 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/ManagedRoutingSlipTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedRoutingSlipTest.java
@@ -32,7 +32,6 @@ public class ManagedRoutingSlipTest extends ManagementTestSupport {
@Override
protected CamelContext createCamelContext() throws Exception {
CamelContext context = super.createCamelContext();
- context.init();
context.getManagementStrategy().getManagementAgent().setStatisticsLevel(ManagementStatisticsLevel.Extended);
return context;
}
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedSanitizeTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedSanitizeTest.java
index 397bac2..49be27c 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/ManagedSanitizeTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedSanitizeTest.java
@@ -28,7 +28,6 @@ public class ManagedSanitizeTest extends ManagementTestSupport {
@Override
protected CamelContext createCamelContext() throws Exception {
CamelContext context = super.createCamelContext();
- context.init();
context.getManagementStrategy().getManagementAgent().setMask(true);
return context;
}
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedSendDynamicProcessorTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedSendDynamicProcessorTest.java
index 78e8259..06ec234 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/ManagedSendDynamicProcessorTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedSendDynamicProcessorTest.java
@@ -32,7 +32,6 @@ public class ManagedSendDynamicProcessorTest extends ManagementTestSupport {
@Override
protected CamelContext createCamelContext() throws Exception {
CamelContext context = super.createCamelContext();
- context.init();
context.getManagementStrategy().getManagementAgent().setStatisticsLevel(ManagementStatisticsLevel.Extended);
return context;
}
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedStartupFailedTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedStartupFailedTest.java
index 3e9f655..66da93c 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/ManagedStartupFailedTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedStartupFailedTest.java
@@ -77,7 +77,6 @@ public class ManagedStartupFailedTest extends ManagementTestSupport {
}
MBeanServer server = getMBeanServer();
- Set<ObjectName> onames = server.queryNames(new ObjectName("org.apache.camel:*"), null);
- assertEquals(Collections.emptySet(), onames);
+ assertNull(server);
}
}
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedStatisticsLevelOffTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedStatisticsLevelOffTest.java
index 78136d5..3a6bbae 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/ManagedStatisticsLevelOffTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedStatisticsLevelOffTest.java
@@ -32,7 +32,6 @@ public class ManagedStatisticsLevelOffTest extends ManagementTestSupport {
@Override
protected CamelContext createCamelContext() throws Exception {
CamelContext context = super.createCamelContext();
- context.init();
// disable it by default
context.getManagementStrategy().getManagementAgent().setStatisticsLevel(ManagementStatisticsLevel.Off);
return context;
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedStatisticsLevelRoutesOnlyTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedStatisticsLevelRoutesOnlyTest.java
index 6dd018e..32766bc 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/ManagedStatisticsLevelRoutesOnlyTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedStatisticsLevelRoutesOnlyTest.java
@@ -31,7 +31,6 @@ public class ManagedStatisticsLevelRoutesOnlyTest extends ManagementTestSupport
@Override
protected CamelContext createCamelContext() throws Exception {
CamelContext context = super.createCamelContext();
- context.init();
// only routes
context.getManagementStrategy().getManagementAgent().setStatisticsLevel(ManagementStatisticsLevel.RoutesOnly);
return context;
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedWireTapTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedWireTapTest.java
index e71f03e..8e0174b 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/ManagedWireTapTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedWireTapTest.java
@@ -32,7 +32,6 @@ public class ManagedWireTapTest extends ManagementTestSupport {
@Override
protected CamelContext createCamelContext() throws Exception {
CamelContext context = super.createCamelContext();
- context.init();
context.getManagementStrategy().getManagementAgent().setStatisticsLevel(ManagementStatisticsLevel.Extended);
return context;
}
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/ChildServiceSupport.java b/core/camel-support/src/main/java/org/apache/camel/support/ChildServiceSupport.java
index c3bbb30..7fe1aed 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/ChildServiceSupport.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/ChildServiceSupport.java
@@ -47,7 +47,7 @@ public abstract class ChildServiceSupport extends ServiceSupport {
return;
}
try {
- initService(childServices);
+ ServiceHelper.initService(childServices);
} catch (Exception e) {
status = FAILED;
LOG.trace("Error while initializing service: " + this, e);
@@ -124,25 +124,24 @@ public abstract class ChildServiceSupport extends ServiceSupport {
protected void addChildService(Object childService) {
if (childService instanceof Service) {
- if (childServices == null) {
- synchronized (lock) {
- if (childServices == null) {
- childServices = new ArrayList<>();
- }
+ synchronized (lock) {
+ if (childServices == null) {
+ childServices = new ArrayList<>();
}
+ childServices.add((Service) childService);
}
- childServices.add((Service) childService);
}
}
protected boolean removeChildService(Object childService) {
- return childServices != null && childServices.remove(childService);
- }
-
- private void initService(List<Service> services) {
- if (services != null) {
- services.forEach(Service::init);
+ if (childService instanceof Service) {
+ synchronized (lock) {
+ if (childServices != null) {
+ return childServices.remove(childService);
+ }
+ }
}
+ return false;
}
}
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 4dd349a..31fc1a4 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
@@ -17,6 +17,9 @@
package org.apache.camel.support;
import java.util.List;
+import java.util.function.BiFunction;
+import java.util.function.Function;
+import java.util.function.Supplier;
import org.apache.camel.CamelContext;
import org.apache.camel.Endpoint;
@@ -69,202 +72,39 @@ public final class EventHelper {
return true;
}
- public static boolean notifyCamelContextStarting(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;
- }
+ public static boolean notifyCamelContextInitializing(CamelContext context) {
+ return notifyCamelContext(context, EventFactory::createCamelContextInitializingEvent);
+ }
- boolean answer = false;
- CamelEvent event = null;
- for (EventNotifier notifier : notifiers) {
- if (notifier.isDisabled()) {
- continue;
- }
- if (notifier.isIgnoreCamelContextEvents()) {
- continue;
- }
+ public static boolean notifyCamelContextInitialized(CamelContext context) {
+ return notifyCamelContext(context, EventFactory::createCamelContextInitializedEvent);
+ }
- if (event == null) {
- // only create event once
- event = factory.createCamelContextStartingEvent(context);
- if (event == null) {
- // factory could not create event so exit
- return false;
- }
- }
- answer |= doNotifyEvent(notifier, event);
- }
- return answer;
+ public static boolean notifyCamelContextStarting(CamelContext context) {
+ return notifyCamelContext(context, EventFactory::createCamelContextStartingEvent);
}
public static boolean notifyCamelContextStarted(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;
- }
-
- boolean answer = false;
- CamelEvent event = null;
- for (EventNotifier notifier : notifiers) {
- if (notifier.isDisabled()) {
- continue;
- }
- if (notifier.isIgnoreCamelContextEvents()) {
- continue;
- }
-
- if (event == null) {
- // only create event once
- event = factory.createCamelContextStartedEvent(context);
- if (event == null) {
- // factory could not create event so exit
- return false;
- }
- }
- answer |= doNotifyEvent(notifier, event);
- }
- return answer;
+ return notifyCamelContext(context, EventFactory::createCamelContextStartedEvent);
}
public static boolean notifyCamelContextStartupFailed(CamelContext context, Throwable cause) {
- 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;
- }
-
- boolean answer = false;
- CamelEvent event = null;
- for (EventNotifier notifier : notifiers) {
- if (notifier.isDisabled()) {
- continue;
- }
- if (notifier.isIgnoreCamelContextEvents()) {
- continue;
- }
-
- if (event == null) {
- // only create event once
- event = factory.createCamelContextStartupFailureEvent(context, cause);
- if (event == null) {
- // factory could not create event so exit
- return false;
- }
- }
- answer |= doNotifyEvent(notifier, event);
- }
- return answer;
+ return notifyCamelContext(context, (ef, ctx) -> ef.createCamelContextStartupFailureEvent(ctx, cause));
}
public static boolean notifyCamelContextStopping(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;
- }
-
- boolean answer = false;
- CamelEvent event = null;
- for (EventNotifier notifier : notifiers) {
- if (notifier.isDisabled()) {
- continue;
- }
- if (notifier.isIgnoreCamelContextEvents()) {
- continue;
- }
-
- if (event == null) {
- // only create event once
- event = factory.createCamelContextStoppingEvent(context);
- if (event == null) {
- // factory could not create event so exit
- return false;
- }
- }
- answer |= doNotifyEvent(notifier, event);
- }
- return answer;
+ return notifyCamelContext(context, EventFactory::createCamelContextStoppingEvent);
}
public static boolean notifyCamelContextStopped(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;
- }
-
- boolean answer = false;
- CamelEvent event = null;
- for (EventNotifier notifier : notifiers) {
- if (notifier.isDisabled()) {
- continue;
- }
- if (notifier.isIgnoreCamelContextEvents()) {
- continue;
- }
-
- if (event == null) {
- // only create event once
- event = factory.createCamelContextStoppedEvent(context);
- if (event == null) {
- // factory could not create event so exit
- return false;
- }
- }
- answer |= doNotifyEvent(notifier, event);
- }
- return answer;
+ return notifyCamelContext(context, EventFactory::createCamelContextStoppedEvent);
}
public static boolean notifyCamelContextStopFailed(CamelContext context, Throwable cause) {
+ return notifyCamelContext(context, (ef, ctx) -> ef.createCamelContextStopFailureEvent(ctx, cause));
+ }
+
+ private static boolean notifyCamelContext(CamelContext context, BiFunction<EventFactory, CamelContext, CamelEvent> eventSupplier) {
ManagementStrategy management = context.getManagementStrategy();
if (management == null) {
return false;
@@ -292,7 +132,7 @@ public final class EventHelper {
if (event == null) {
// only create event once
- event = factory.createCamelContextStopFailureEvent(context, cause);
+ event = eventSupplier.apply(factory, context);
if (event == null) {
// factory could not create event so exit
return false;
diff --git a/docs/components/modules/ROOT/pages/index.adoc b/docs/components/modules/ROOT/pages/index.adoc
index e058017..20180bf 100644
--- a/docs/components/modules/ROOT/pages/index.adoc
+++ b/docs/components/modules/ROOT/pages/index.adoc
@@ -684,6 +684,151 @@ Number of Components: 332 in 265 JAR artifacts (1 deprecated)
|===
// components: END
+== Data Formats
+
+// dataformats: START
+Number of Data Formats: 45 in 37 JAR artifacts (0 deprecated)
+
+[width="100%",cols="4,1,5",options="header"]
+|===
+| Data Format | Since | Description
+
+| xref:dataformats:any23-dataformat.adoc[Any23] (camel-any23) | 3.0 | Any23 data format is used for parsing data to RDF.
+
+| xref:dataformats:asn1-dataformat.adoc[ASN.1 File] (camel-asn1) | 2.20 | The ASN.1 data format is used for file transfer with telecommunications protocols.
+
+| xref:dataformats:avro-dataformat.adoc[Avro] (camel-avro) | 2.14 | The Avro data format is used for serialization and deserialization of messages using Apache Avro binary dataformat.
+
+| xref:dataformats:barcode-dataformat.adoc[Barcode] (camel-barcode) | 2.14 | The Barcode data format is used for creating barccode images (such as QR-Code)
+
+| xref:dataformats:base64-dataformat.adoc[Base64] (camel-base64) | 2.11 | The Base64 data format is used for base64 encoding and decoding.
+
+| xref:dataformats:beanio-dataformat.adoc[BeanIO] (camel-beanio) | 2.10 | The BeanIO data format is used for working with flat payloads (such as CSV, delimited, or fixed length formats).
+
+| xref:dataformats:bindy-dataformat.adoc[Bindy CSV] (camel-bindy) | 2.0 | The Bindy data format is used for working with flat payloads (such as CSV, delimited, fixed length formats, or FIX messages).
+
+| xref:dataformats:bindy-dataformat.adoc[Bindy Fixed Length] (camel-bindy) | 2.0 | The Bindy data format is used for working with flat payloads (such as CSV, delimited, fixed length formats, or FIX messages).
+
+| xref:dataformats:bindy-dataformat.adoc[Bindy Key Value Pair] (camel-bindy) | 2.0 | The Bindy data format is used for working with flat payloads (such as CSV, delimited, fixed length formats, or FIX messages).
+
+| xref:dataformats:cbor-dataformat.adoc[CBOR] (camel-cbor) | 3.0 | CBOR data format is used for unmarshal a CBOR payload to POJO or to marshal POJO back to CBOR payload.
+
+| xref:dataformats:crypto-dataformat.adoc[Crypto (Java Cryptographic Extension)] (camel-crypto) | 2.3 | Crypto data format is used for encrypting and decrypting of messages using Java Cryptographic Extension.
+
+| xref:dataformats:csv-dataformat.adoc[CSV] (camel-csv) | 1.3 | The CSV data format is used for handling CSV payloads.
+
+| xref:dataformats:fhirJson-dataformat.adoc[FHIR JSon] (camel-fhir) | 2.21 | The FHIR JSon data format is used to marshall/unmarshall to/from FHIR objects to/from JSON.
+
+| xref:dataformats:fhirXml-dataformat.adoc[FHIR XML] (camel-fhir) | 2.21 | The FHIR XML data format is used to marshall/unmarshall from/to FHIR objects to/from XML.
+
+| xref:dataformats:flatpack-dataformat.adoc[Flatpack] (camel-flatpack) | 2.1 | The Flatpack data format is used for working with flat payloads (such as CSV, delimited, or fixed length formats).
+
+| xref:dataformats:grok-dataformat.adoc[Grok] (camel-grok) | 3.0 | The Grok data format is used for unmarshalling unstructured data to objects using Logstash based Grok patterns.
+
+| xref:dataformats:gzipdeflater-dataformat.adoc[GZip Deflater] (camel-zip-deflater) | 2.0 | The GZip data format is a message compression and de-compression format (which works with the popular gzip/gunzip tools).
+
+| xref:dataformats:hl7-dataformat.adoc[HL7] (camel-hl7) | 2.0 | The HL7 data format can be used to marshal or unmarshal HL7 (Health Care) model objects.
+
+| xref:dataformats:ical-dataformat.adoc[iCal] (camel-ical) | 2.12 | The iCal dataformat is used for working with iCalendar messages.
+
+| xref:dataformats:jacksonxml-dataformat.adoc[JacksonXML] (camel-jacksonxml) | 2.16 | JacksonXML data format is used for unmarshal a XML payload to POJO or to marshal POJO back to XML payload.
+
+| xref:dataformats:jaxb-dataformat.adoc[JAXB] (camel-jaxb) | 1.0 | JAXB data format uses the JAXB2 XML marshalling standard to unmarshal an XML payload into Java objects or to marshal Java objects into an XML payload.
+
+| xref:dataformats:json-fastjson-dataformat.adoc[JSon Fastjson] (camel-fastjson) | 2.20 | JSon data format is used for unmarshal a JSon payload to POJO or to marshal POJO back to JSon payload.
+
+| xref:dataformats:json-gson-dataformat.adoc[JSon GSon] (camel-gson) | 2.10 | JSon data format is used for unmarshal a JSon payload to POJO or to marshal POJO back to JSon payload.
+
+| xref:dataformats:json-jackson-dataformat.adoc[JSon Jackson] (camel-jackson) | 2.0 | JSon data format is used for unmarshal a JSon payload to POJO or to marshal POJO back to JSon payload.
+
+| xref:dataformats:json-johnzon-dataformat.adoc[JSon Johnzon] (camel-johnzon) | 2.18 | JSon data format is used for unmarshal a JSon payload to POJO or to marshal POJO back to JSon payload.
+
+| xref:dataformats:json-xstream-dataformat.adoc[JSon XStream] (camel-xstream) | 2.0 | JSon data format is used for unmarshal a JSon payload to POJO or to marshal POJO back to JSon payload.
+
+| xref:dataformats:jsonApi-dataformat.adoc[JSonApi] (camel-jsonapi) | 3.0 | JSonApi data format is used for marshal and unmarshal Json API object.
+
+| xref:dataformats:lzf-dataformat.adoc[LZF Deflate Compression] (camel-lzf) | 2.17 | The LZF data format is a message compression and de-compression format (uses the LZF deflate algorithm).
+
+| xref:dataformats:mime-multipart-dataformat.adoc[MIME Multipart] (camel-mail) | 2.17 | The MIME Multipart data format is used for marshalling Camel messages with attachments into MIME-Multipart message, and vise-versa.
+
+| xref:dataformats:pgp-dataformat.adoc[PGP] (camel-crypto) | 2.9 | PGP data format is used for encrypting and decrypting of messages using Java Cryptographic Extension and PGP.
+
+| xref:dataformats:protobuf-dataformat.adoc[Protobuf] (camel-protobuf) | 2.2 | The Protobuf data format is used for serializing between Java objects and the Google Protobuf protocol.
+
+| xref:dataformats:rss-dataformat.adoc[RSS] (camel-rss) | 2.1 | RSS data format is used for working with RSS sync feed Java Objects and transforming to XML and vice-versa.
+
+| xref:dataformats:soapjaxb-dataformat.adoc[SOAP] (camel-soap) | 2.3 | SOAP is a data format which uses JAXB2 and JAX-WS annotations to marshal and unmarshal SOAP payloads.
+
+| xref:dataformats:syslog-dataformat.adoc[Syslog] (camel-syslog) | 2.6 | The Syslog dataformat is used for working with RFC3164 and RFC5424 messages (logging and monitoring).
+
+| xref:dataformats:tarfile-dataformat.adoc[Tar File] (camel-tarfile) | 2.16 | The Tar File data format is a message compression and de-compression format of tar files.
+
+| xref:dataformats:thrift-dataformat.adoc[Thrift] (camel-thrift) | 2.20 | The Thrift data format is used for serialization and deserialization of messages using Apache Thrift binary dataformat.
+
+| xref:dataformats:tidyMarkup-dataformat.adoc[TidyMarkup] (camel-tagsoup) | 2.0 | TidyMarkup data format is used for parsing HTML and return it as pretty well-formed HTML.
+
+| xref:dataformats:univocity-csv-dataformat.adoc[uniVocity CSV] (camel-univocity-parsers) | 2.15 | The uniVocity CSV data format is used for working with CSV (Comma Separated Values) flat payloads.
+
+| xref:dataformats:univocity-fixed-dataformat.adoc[uniVocity Fixed Length] (camel-univocity-parsers) | 2.15 | The uniVocity Fixed Length data format is used for working with fixed length flat payloads.
+
+| xref:dataformats:univocity-tsv-dataformat.adoc[uniVocity TSV] (camel-univocity-parsers) | 2.15 | The uniVocity TSV data format is used for working with TSV (Tabular Separated Values) flat payloads.
+
+| xref:dataformats:secureXML-dataformat.adoc[XML Security] (camel-xmlsecurity) | 2.0 | The XML Security data format facilitates encryption and decryption of XML payloads.
+
+| xref:dataformats:xstream-dataformat.adoc[XStream] (camel-xstream) | 1.3 | XStream data format is used for unmarshal a XML payload to POJO or to marshal POJO back to XML payload.
+
+| xref:dataformats:yaml-snakeyaml-dataformat.adoc[YAML SnakeYAML] (camel-snakeyaml) | 2.17 | YAML is a data format to marshal and unmarshal Java objects to and from YAML.
+
+| xref:dataformats:zipdeflater-dataformat.adoc[Zip Deflate Compression] (camel-zip-deflater) | 2.12 | Zip Deflate Compression data format is a message compression and de-compression format (not zip files).
+
+| xref:dataformats:zipfile-dataformat.adoc[Zip File] (camel-zipfile) | 2.11 | The Zip File data format is a message compression and de-compression format of zip files.
+|===
+// dataformats: END
+
+== Expression Languages
+
+// languages: START
+Number of Languages: 17 in 11 JAR artifacts (0 deprecated)
+
+[width="100%",cols="4,1,5",options="header"]
+|===
+| Language | Since | Description
+
+| xref:languages:bean-language.adoc[Bean method] (camel-bean) | 1.3 | To use a Java bean (aka method call) in Camel expressions or predicates.
+
+| xref:languages:constant-language.adoc[Constant] (camel-core-languages) | 1.5 | To use a constant value in Camel expressions or predicates. Important: this is a fixed constant value that is only set once during starting up the route, do not use this if you want dynamic values during routing.
+
+| xref:languages:exchangeProperty-language.adoc[ExchangeProperty] (camel-core-languages) | 2.0 | To use a Camel Exchange property in expressions or predicates.
+
+| xref:languages:file-language.adoc[File] (camel-core-languages) | 1.1 | For expressions and predicates using the file/simple language.
+
+| xref:languages:groovy-language.adoc[Groovy] (camel-groovy) | 1.3 | To use Groovy scripts in Camel expressions or predicates.
+
+| xref:languages:header-language.adoc[Header] (camel-core-languages) | 1.5 | To use a Camel Message header in expressions or predicates.
+
+| xref:languages:hl7terser-language.adoc[HL7 Terser] (camel-hl7) | 2.11 | To use HL7 terser scripts in Camel expressions or predicates.
+
+| xref:languages:jsonpath-language.adoc[JsonPath] (camel-jsonpath) | 2.13 | To use JsonPath in Camel expressions or predicates.
+
+| xref:languages:mvel-language.adoc[MVEL] (camel-mvel) | 2.0 | To use MVEL scripts in Camel expressions or predicates.
+
+| xref:languages:ognl-language.adoc[OGNL] (camel-ognl) | 1.1 | To use OGNL scripts in Camel expressions or predicates.
+
+| xref:languages:ref-language.adoc[Ref] (camel-core-languages) | 2.8 | Reference to an existing Camel expression or predicate, which is looked up from the Camel registry.
+
+| xref:languages:simple-language.adoc[Simple] (camel-core-languages) | 1.1 | To use Camels built-in Simple language in Camel expressions or predicates.
+
+| xref:languages:spel-language.adoc[SpEL] (camel-spring) | 2.7 | To use Spring Expression Language (SpEL) in Camel expressions or predicates.
+
+| xref:languages:tokenize-language.adoc[Tokenize] (camel-core-languages) | 2.0 | To use Camel message body or header with a tokenizer in Camel expressions or predicates.
+
+| xref:languages:xtokenize-language.adoc[XML Tokenize] (camel-xml-jaxp) | 2.14 | To use Camel message body or header with a XML tokenizer in Camel expressions or predicates.
+
+| xref:languages:xpath-language.adoc[XPath] (camel-xpath) | 1.1 | To use XPath (XML) in Camel expressions or predicates.
+
+| xref:languages:xquery-language.adoc[XQuery] (camel-saxon) | 1.0 | To use XQuery (XML) in Camel expressions or predicates.
+|===
+// languages: END
== Miscellaneous Components