Chapter 91. Ehcache Component Available as of Camel version 2.18 The ehcache component enables you to perform caching operations using Ehcache 3 as the Cache Implementation. This component supports producer and event based consumer endpoints. The Cache consumer is an event based consumer and can be used to listen and respond to specific cache activities. Maven users will need to add the following dependency to their pom.xml for this component: <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-ehcache</artifactId> <version>x.x.x</version> <!-- use the same version as your Camel core version --> </dependency> 91.1. URI format ehcache://cacheName[?options] You can append query options to the URI in the following format, ?option=value&option=#beanRef&... 91.2. Options The Ehcache component supports 7 options, which are listed below. Name Description Default Type configuration (advanced) Sets the global component configuration EhcacheConfiguration cacheManager (common) The cache manager CacheManager cacheManager Configuration (common) The cache manager configuration Configuration cacheConfiguration (common) The default cache configuration to be used to create caches. CacheConfiguration cachesConfigurations (common) A map of caches configurations to be used to create caches. Map cacheConfigurationUri (common) URI pointing to the Ehcache XML configuration file's location String resolveProperty Placeholders (advanced) Whether the component should resolve property placeholders on itself when starting. Only properties which are of String type can use property placeholders. true boolean The Ehcache endpoint is configured using URI syntax: with the following path and query parameters: 91.2.1. Path Parameters (1 parameters): Name Description Default Type cacheName Required the cache name String 91.2.2. Query Parameters (17 parameters): Name Description Default Type cacheManager (common) The cache manager CacheManager cacheManagerConfiguration (common) The cache manager configuration Configuration configurationUri (common) URI pointing to the Ehcache XML configuration file's location String createCacheIfNotExist (common) Configure if a cache need to be created if it does exist or can't be pre-configured. true boolean bridgeErrorHandler (consumer) Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. false boolean eventFiring (consumer) Set the delivery mode (synchronous, asynchronous) ASYNCHRONOUS EventFiring eventOrdering (consumer) Set the delivery mode (ordered, unordered) ORDERED EventOrdering eventTypes (consumer) Set the type of events to listen for EVICTED,EXPIRED,REMOVED,CREATED,UPDATED Set exceptionHandler (consumer) To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the consumer will deal with exceptions, that will be logged at WARN or ERROR level and ignored. ExceptionHandler exchangePattern (consumer) Sets the exchange pattern when the consumer creates an exchange. ExchangePattern action (producer) To configure the default cache action. If an action is set in the message header, then the operation from the header takes precedence. String key (producer) To configure the default action key. If a key is set in the message header, then the key from the header takes precedence. Object configuration (advanced) The default cache configuration to be used to create caches. CacheConfiguration configurations (advanced) A map of cache configuration to be used to create caches. Map keyType (advanced) The cache key type, default java.lang.Object java.lang.Object String synchronous (advanced) Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). false boolean valueType (advanced) The cache value type, default java.lang.Object java.lang.Object String 91.3. Spring Boot Auto-Configuration The component supports 25 options, which are listed below. Name Description Default Type camel.component.ehcache.cache-configuration The default cache configuration to be used to create caches. The option is a org.ehcache.config.CacheConfiguration<?,?> type. String camel.component.ehcache.cache-configuration-uri URI pointing to the Ehcache XML configuration file's location String camel.component.ehcache.cache-manager The cache manager. The option is a org.ehcache.CacheManager type. String camel.component.ehcache.cache-manager-configuration The cache manager configuration. The option is a org.ehcache.config.Configuration type. String camel.component.ehcache.caches-configurations A map of caches configurations to be used to create caches. Map camel.component.ehcache.configuration.action To configure the default cache action. If an action is set in the message header, then the operation from the header takes precedence. String camel.component.ehcache.configuration.cache-manager The cache manager CacheManager camel.component.ehcache.configuration.cache-manager-configuration The cache manager configuration Configuration camel.component.ehcache.configuration.configuration The default cache configuration to be used to create caches. CacheConfiguration camel.component.ehcache.configuration.configuration-uri URI pointing to the Ehcache XML configuration file's location String camel.component.ehcache.configuration.configurations A map of cache configuration to be used to create caches. Map camel.component.ehcache.configuration.create-cache-if-not-exist Configure if a cache need to be created if it does exist or can't be pre-configured. true Boolean camel.component.ehcache.configuration.event-firing Set the delivery mode (synchronous, asynchronous) EventFiring camel.component.ehcache.configuration.event-ordering Set the delivery mode (ordered, unordered) EventOrdering camel.component.ehcache.configuration.event-types Set the type of events to listen for Set camel.component.ehcache.configuration.key To configure the default action key. If a key is set in the message header, then the key from the header takes precedence. Object camel.component.ehcache.configuration.key-type The cache key type, default java.lang.Object java.lang.Object String camel.component.ehcache.configuration.value-type The cache value type, default java.lang.Object java.lang.Object String camel.component.ehcache.customizer.cache-configuration.enabled Enable or disable the cache-configuration customizer. true Boolean camel.component.ehcache.customizer.cache-configuration.mode Configure if the cache configurations have be added or they have to replace those already configured on the component. CacheConfiguration CustomizerConfigurationUSD Mode camel.component.ehcache.customizer.cache-manager.enabled Enable or disable the cache-manager customizer. true Boolean camel.component.ehcache.customizer.cache-manager.override Configure if the cache manager eventually set on the component should be overridden by the customizer. false Boolean camel.component.ehcache.enabled Enable ehcache component true Boolean camel.component.ehcache.resolve-property-placeholders Whether the component should resolve property placeholders on itself when starting. Only properties which are of String type can use property placeholders. true Boolean camel.component.ehcache.configuration.config-uri (DEPRECATED - Use set configurationUri(String) instead.) URI pointing to the Ehcache XML configuration file's location String 91.3.1. Message Headers Camel Header Type Description CamelEhcacheAction String The operation to be perfomed on the cache, valid options are: * CLEAR * PUT * PUT_ALL * PUT_IF_ABSENT * GET * GET_ALL * REMOVE * REMOVE_ALL * REPLACE CamelEhcacheActionHasResult Boolean Set to true if the action has a result CamelEhcacheActionSucceeded Boolean Set to true if the actionsuccedded CamelEhcacheKey Object The cache key used for an action CamelEhcacheKeys Set<Object> A list of keys, used in * PUT_ALL * GET_ALL * REMOVE_ALL CamelEhcacheValue Object The value to put in the cache or the result of an operation CamelEhcacheOldValue Object The old value associated to a key for actions like PUT_IF_ABSENT or the Object used for comparison for actions like REPLACE CamelEhcacheEventType EventType The type of event received 91.4. Ehcache based idempotent repository example: CacheManager manager = CacheManagerBuilder.newCacheManager(new XmlConfiguration("ehcache.xml")); EhcacheIdempotentRepository repo = new EhcacheIdempotentRepository(manager, "idempotent-cache"); from("direct:in") .idempotentConsumer(header("messageId"), idempotentRepo) .to("mock:out"); 91.5. Ehcache based aggregation repository example: public class EhcacheAggregationRepositoryRoutesTest extends CamelTestSupport { private static final String ENDPOINT_MOCK = "mock:result"; private static final String ENDPOINT_DIRECT = "direct:one"; private static final int[] VALUES = generateRandomArrayOfInt(10, 0, 30); private static final int SUM = IntStream.of(VALUES).reduce(0, (a, b) -> a + b); private static final String CORRELATOR = "CORRELATOR"; @EndpointInject(uri = ENDPOINT_MOCK) private MockEndpoint mock; @Produce(uri = ENDPOINT_DIRECT) private ProducerTemplate producer; @Test public void checkAggregationFromOneRoute() throws Exception { mock.expectedMessageCount(VALUES.length); mock.expectedBodiesReceived(SUM); IntStream.of(VALUES).forEach( i -> producer.sendBodyAndHeader(i, CORRELATOR, CORRELATOR) ); mock.assertIsSatisfied(); } private Exchange aggregate(Exchange oldExchange, Exchange newExchange) { if (oldExchange == null) { return newExchange; } else { Integer n = newExchange.getIn().getBody(Integer.class); Integer o = oldExchange.getIn().getBody(Integer.class); Integer v = (o == null ? 0 : o) + (n == null ? 0 : n); oldExchange.getIn().setBody(v, Integer.class); return oldExchange; } } @Override protected RoutesBuilder createRouteBuilder() throws Exception { return new RouteBuilder() { @Override public void configure() throws Exception { from(ENDPOINT_DIRECT) .routeId("AggregatingRouteOne") .aggregate(header(CORRELATOR)) .aggregationRepository(createAggregateRepository()) .aggregationStrategy(EhcacheAggregationRepositoryRoutesTest.this::aggregate) .completionSize(VALUES.length) .to("log:org.apache.camel.component.ehcache.processor.aggregate.level=INFO&showAll=true&mulltiline=true") .to(ENDPOINT_MOCK); } }; } protected EhcacheAggregationRepository createAggregateRepository() throws Exception { CacheManager cacheManager = CacheManagerBuilder.newCacheManager(new XmlConfiguration("ehcache.xml")); cacheManager.init(); EhcacheAggregationRepository repository = new EhcacheAggregationRepository(); repository.setCacheManager(cacheManager); repository.setCacheName("aggregate"); return repository; } }

Commands:
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-ehcache</artifactId> <version>x.x.x</version> <!-- use the same version as your Camel core version --> </dependency>
ehcache://cacheName[?options]
ehcache:cacheName
CacheManager manager = CacheManagerBuilder.newCacheManager(new XmlConfiguration("ehcache.xml")); EhcacheIdempotentRepository repo = new EhcacheIdempotentRepository(manager, "idempotent-cache"); from("direct:in") .idempotentConsumer(header("messageId"), idempotentRepo) .to("mock:out");
public class EhcacheAggregationRepositoryRoutesTest extends CamelTestSupport { private static final String ENDPOINT_MOCK = "mock:result"; private static final String ENDPOINT_DIRECT = "direct:one"; private static final int[] VALUES = generateRandomArrayOfInt(10, 0, 30); private static final int SUM = IntStream.of(VALUES).reduce(0, (a, b) -> a + b); private static final String CORRELATOR = "CORRELATOR"; @EndpointInject(uri = ENDPOINT_MOCK) private MockEndpoint mock; @Produce(uri = ENDPOINT_DIRECT) private ProducerTemplate producer; @Test public void checkAggregationFromOneRoute() throws Exception { mock.expectedMessageCount(VALUES.length); mock.expectedBodiesReceived(SUM); IntStream.of(VALUES).forEach( i -> producer.sendBodyAndHeader(i, CORRELATOR, CORRELATOR) ); mock.assertIsSatisfied(); } private Exchange aggregate(Exchange oldExchange, Exchange newExchange) { if (oldExchange == null) { return newExchange; } else { Integer n = newExchange.getIn().getBody(Integer.class); Integer o = oldExchange.getIn().getBody(Integer.class); Integer v = (o == null ? 0 : o) + (n == null ? 0 : n); oldExchange.getIn().setBody(v, Integer.class); return oldExchange; } } @Override protected RoutesBuilder createRouteBuilder() throws Exception { return new RouteBuilder() { @Override public void configure() throws Exception { from(ENDPOINT_DIRECT) .routeId("AggregatingRouteOne") .aggregate(header(CORRELATOR)) .aggregationRepository(createAggregateRepository()) .aggregationStrategy(EhcacheAggregationRepositoryRoutesTest.this::aggregate) .completionSize(VALUES.length) .to("log:org.apache.camel.component.ehcache.processor.aggregate.level=INFO&showAll=true&mulltiline=true") .to(ENDPOINT_MOCK); } }; } protected EhcacheAggregationRepository createAggregateRepository() throws Exception { CacheManager cacheManager = CacheManagerBuilder.newCacheManager(new XmlConfiguration("ehcache.xml")); cacheManager.init(); EhcacheAggregationRepository repository = new EhcacheAggregationRepository(); repository.setCacheManager(cacheManager); repository.setCacheName("aggregate"); return repository; } }