Context Component
Available as of Camel 2.7
The context component allows you to create a CamelContext with a number of routes inside then treat it as a black box and refer to the local endpoints within the black box from other CamelContexts.
It is similar to the Routebox component, though the Context component tries to be really simple for end users; just a simple convention over configuration approach to refer to local endpoints inside a black box (CamelContext).
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-context</artifactId>
<version>x.x.x</version>
</dependency>
URI format
context:camelContextId:localEndpointName[?options]
Or you can omit the "context:" prefix.
camelContextId:localEndpointName[?options]
The localEndpoint name can be a valid Camel URI evaluated within the black box CamelContext. Or it can be a logical name which is mapped to any local endpoints. For example if you locally have endpoints like direct:invoices* and *seda:purchaseOrders* inside a CamelContext of id *supplyChain, then you can just use the URIs **supplyChain:invoices* or *supplyChain:purchaseOrders* to omit the physical endpoint kind and use pure logical URIs.
You can append query options to the URI in the following format, ?option=value&option=value&...
Example
First you need to create a CamelContext, add some routes in it, start it and then register the CamelContext into the Registry (JNDI, Spring, Guice or OSGi etc).
This can be done in the usual Camel way from this test case; this example shows Java and JNDI being used...
DefaultCamelContext blackBox = new DefaultCamelContext(registry);
blackBox.setName("blackBox");
blackBox.addRoutes(new RouteBuilder() {
@Override
public void configure() throws Exception {
from("direct:purchaseOrder").
setHeader("received").constant("true").
to("direct:invoice");
}
});
blackBox.start();
registry.bind("accounts", blackBox);
Notice in the above route we are using pure local endpoints (*direct* and *seda). Also note we expose this CamelContext using the **accounts* ID. We can do the same thing in Spring via
<camelContext id="accounts">
<route>
<from uri="direct:purchaseOrder"/>
...
<to uri="direct:invoice"/>
</route>
</camelContext>
Then in another CamelContext we can then refer to this "accounts black box" by just sending to *accounts:purchaseOrder* and consuming from *accounts:invoice*.
If you prefer to be more verbose and explicit you could use *context:accounts:purchaseOrder* or even *context:accounts:direct://purchaseOrder* if you prefer. But using logical endpoint URIs is preferred as it hides the implementation detail and provides a simple logical naming scheme.