| = Advanced configuration of CamelContext using Spring |
| |
| When using Spring the CamelContext can be pre configured based on |
| defined beans in spring XML. |
| This page documents these features. Most of these features |
| requires *Camel 2.0*. |
| |
| == What can be configured |
| |
| The following functions can be configured: |
| |
| * xref:pluggable-class-resolvers.adoc[Class resolvers] |
| * xref:lifecycle.adoc[Lifecycle factories] |
| * xref:registry.adoc[Registry for lookup] |
| * xref:debugger.adoc[Debugger], xref:tracer.adoc[Tracer], |
| xref:delay-interceptor.adoc[Delay] and |
| xref:uuidgenerator.adoc[UuidGenerator] |
| * xref:{eip-vc}:eips:intercept.adoc[Intercept] |
| * xref:graceful-shutdown.adoc[Graceful Shutdown] |
| * xref:stream-caching.adoc[Stream caching] |
| * Logging |
| |
| Camel will configure these functions by doing a lookup in the Spring |
| bean registry to find beans of the given type |
| When Camel finds and uses any of these it logs at `INFO` level. |
| |
| The following list all requires at most 1 beans defined. If there are |
| more than 1 bean of this type, then Camel will *not* use it. |
| |
| [width="100%",cols="34%,33%,33%",options="header",] |
| |======================================================================= |
| |Type |Number of beans |Description |
| |PackageScanClassResolver |0..1 |To use a 3rd party package scan |
| resolver. More details at xref:pluggable-class-resolvers.adoc[Pluggable |
| Class Resolvers]. |
| |
| |ClassResolver |0..1 |To use a 3rd party class resolver. More details at |
| xref:pluggable-class-resolvers.adoc[Pluggable Class Resolvers]. |
| |
| |FactoryFinderResolver |0..1 |To use a 3rd party factory finder. |
| |
| |Registry |0..1 |To use a 3rd party bean registry. By default Camel will |
| use Spring ApplicationContext as registry. |
| |
| |Debugger |0..1 |To use a xref:debugger.adoc[Debugger] usually for |
| tooling. |
| |
| |Tracer |0..1 |To use a 3rd party xref:tracer.adoc[Tracer]. |
| |
| |TraceFormatter |0..1 |To use a bean that has the tracing options |
| configured. |
| |
| |HandleFault |0..1 |To use a 3rd part fault handler to handle FAULT |
| messages. |
| |
| |Delayer |0..1 |To use a 3rd part xref:{eip-vc}:eips:delay-eip.adoc[Delayer]. |
| |
| |ManagementStrategy |0..1 |*Camel 2.1:* To use a 3rd part strategy for |
| xref:jmx.adoc[management], for example JMX management. |
| |
| |ManagementNamingStrategy |0..1 |*Camel 2.6:* To use a 3rd part strategy |
| for naming MBeans for xref:jmx.adoc[management]. |
| |
| |NodeIdFactory |0..1 |*Camel 2.10:* To use a 3rd part node id factory. |
| |
| |EventFactory |0..1 |*Camel 2.1:* To use a 3rd part event factory. |
| |
| |EventNotifier |0..1 |*Camel 2.1:* To use a 3rd part event notifier. In |
| Camel 2.2 onwards you can have multiple notifiers, see next table. |
| |
| |InflightRepository |0..1 |*Camel 2.1:* To use a 3rd part inflight |
| repository. |
| |
| |ShutdownStrategy |0..1 |*Camel 2.2:* To use a 3rd part shutdown |
| strategy. |
| |
| |ExecutorServiceStrategy |0..1 |*Camel 2.3 - 2.8.x:* To use a 3rd part |
| executor service strategy. More details at |
| xref:threading-model.adoc[Threading Model]. |
| |
| |ExecutorServiceManager |0..1 |*Camel 2.9:* To use a 3rd part executor |
| service manager. More details at xref:threading-model.adoc[Threading |
| Model]. |
| |
| |ThreadPoolFactory |0..1 |*Camel 2.9:* To use a 3rd part thread pool |
| factory. More details at xref:threading-model.adoc[Threading Model]. |
| |
| |ProcessorFactory |0..1 |*Camel 2.4:* To use a 3rd part processor |
| factory. |
| |
| |UuidGenerator |0..1 |*Camel 2.5:* To use a 3rd part |
| xref:uuidgenerator.adoc[UuidGenerator]. |
| |
| |StreamCachingStrategy |0..1 |*Camel 2.12:* To use a 3rd part |
| xref:stream-caching.adoc[Stream caching] strategy. |
| |
| |UnitOfWorkFactory |0..1 |*Camel 2.12.3/2.13:* To use 3rd part |
| `UnitOfWork` implementations created by the factory. |
| |
| |RuntimeEndpointRegistry |0..1 |*Camel 2.13.1:* To use a 3rd party |
| RuntimeEndpointRegistry implementation. |
| |
| |Logger |0..1 |*Camel 2.12.4/2.13.1:* To use provided org.slf4j.Logger |
| for xref:components::log-component.adoc[Log] component and xref:{eip-vc}:eips:log-eip.adoc[log() EIP]. |
| |
| |AsyncProcessorAwaitManager |0..1 |*Camel 2.15:* To use a 3rd part async |
| process await manager. |
| |
| |ModelJAXBContextFactory |0..1 |*Camel 2.15.2:* To use a 3rd party model |
| JAXB ContextFactory |
| |
| |MessageHistoryFactory |0..1 |*Camel 2.17:* To use a 3rd party |
| MessageHistoryFactory implementation. |
| |======================================================================= |
| |
| And the following options have support for any number of beans defined. |
| |
| [width="100%",cols="34%,33%,33%",options="header",] |
| |======================================================================= |
| |Type |Number of beans |Description |
| |InterceptStrategy |0..n |To use your own xref:{eip-vc}:eips:intercept.adoc[Intercept] |
| that intercepts every processing steps in all routes in the |
| xref:camelcontext.adoc[CamelContext]. For instance you can use this to |
| do an AOP like performance timer interceptor. |
| |
| |LifecycleStrategy |0..n |*Camel 2.1:* To use 3rd party lifecycle |
| strategies. By default Camel uses a JMX aware that does JMX |
| instrumentation. |
| |
| |EventNotifier |0..n |*Camel 2.2:* To use 3rd part event notifiers. |
| |
| |RoutePolicyFactory |0..n |*Camel 2.14:* To use a 3rd party route policy |
| factory to create a route policy for every route. |
| |======================================================================= |
| |
| Camel will log at `INFO` level if it pickup and uses a custom bean using |
| `org.apache.camel.spring.CamelContextFactoryBean` as name. |
| |
| [[AdvancedconfigurationofCamelContextusingSpring-Usingcontainerwideinterceptors]] |
| == Using container wide interceptors |
| |
| Imagine that you have multiple xref:camelcontext.adoc[CamelContext] and |
| you want to configure that they all use the same container wide |
| interceptor. How do we do that? Well we can leverage the fact that Camel |
| can auto detect and use custom interceptors. So what we simply do is to |
| define our interceptor in the spring xml file. The sample below does |
| this and also define 2 camel contexts. The sample is based on unit |
| test.Error rendering macro 'code': Invalid value specified for parameter |
| 'java.lang.NullPointerException' |
| |
| [source,xml] |
| ---- |
| <!-- here we define a spring bean that is our container wide interceptor |
| its important to notice that the class ContainerWideInterceptor implements |
| org.apache.camel.spi.InterceptStrategy that allows us to plugin our interceptors |
| Camel will at startup automatic look for any beans in spring registry that is an |
| instance of org.apache.camel.spi.InterceptStrategy and add it as interceptor |
| to all its routes. Using this we are capable of defining container wide interceptors |
| that gets used in all camel contests we define with spring --> |
| <bean id="myInterceptor" class="org.apache.camel.spring.interceptor.ContainerWideInterceptor"/> |
| |
| <!-- here we have the 1st CamelContext --> |
| <camelContext id="camel1" xmlns="http://camel.apache.org/schema/spring"> |
| <route> |
| <from uri="direct:one"/> |
| <to uri="mock:result"/> |
| </route> |
| </camelContext> |
| |
| <!-- and there we have the 2nd CamelContext --> |
| <camelContext id="camel2" xmlns="http://camel.apache.org/schema/spring"> |
| <route> |
| <from uri="direct:two"/> |
| <to uri="log:two"/> |
| <to uri="mock:result"/> |
| </route> |
| </camelContext> |
| ---- |
| |
| Okay lets build our interceptor to simply count the number of |
| interceptions. This is quite easy as we can just implement this logic in |
| our implementation directly as the code below illustrates:Error |
| rendering macro 'code': Invalid value specified for parameter |
| 'java.lang.NullPointerException' |
| |
| [source,java] |
| ---- |
| public class ContainerWideInterceptor implements InterceptStrategy { |
| |
| private static final Logger LOG = LoggerFactory.getLogger(ContainerWideInterceptor.class); |
| private static int count; |
| |
| public Processor wrapProcessorInInterceptors(final CamelContext context, final NamedNode definition, |
| final Processor target, final Processor nextTarget) throws Exception { |
| |
| // as this is based on an unit test we are a bit lazy and just create an inlined processor |
| // where we implement our interception logic. |
| return new Processor() { |
| public void process(Exchange exchange) throws Exception { |
| // we just count number of interceptions |
| count++; |
| LOG.info("I am the container wide interceptor. Intercepted total count: " + count); |
| // its important that we delegate to the real target so we let target process the exchange |
| target.process(exchange); |
| } |
| |
| @Override |
| public String toString() { |
| return "ContainerWideInterceptor[" + target + "]"; |
| } |
| }; |
| } |
| |
| public int getCount() { |
| return count; |
| } |
| } |
| ---- |
| |
| When Camel boots up it logs at `INFO` level the container wide |
| interceptors it have found: |
| |
| [source,syntaxhighlighter-pre] |
| ---- |
| INFO CamelContextFactoryBean - Using custom intercept strategy with id: myInterceptor and implementation:org.apache.camel.spring.interceptor.ContainerWideInterceptor@b84c44 |
| ---- |
| |
| *Notice:* If we have more than 1 container wide interceptor, we can just |
| define them as spring bean. Camel will find and use them. |
| |