Wiki Markup |
---|
h2. Cache Component |
...
*Available as of Camel 2.1 |
...
* The *cache* component enables you to perform caching operations using EHCache as the Cache Implementation. The cache itself is created on demand or if a cache of that name already exists then it is simply utilized with its original settings. |
...
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. If you need to perform selections from a pre-existing cache, used the processors defined for the cache component. |
...
Maven users will need to add the following dependency to their {{pom.xml}} for this component: |
...
{code | ||
:xml | xml | }
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-cache</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
|
URI format
Code Block |
---|
{code} h3. URI format {code} cache://cacheName[?options] {code} You can append query options to the URI in the following format, {{?option=value&option=value&... |
...
Options
Name | Default Value | Description |
---|---|---|
| | The numer of elements that may be stored in the defined cache |
| | The number of elements that may be stored in the defined cache. Options include
|
| | Specifies whether cache may overflow to disk |
| | Sets whether elements are eternal. If eternal, timeouts are ignored and the |
| | The maximum time between creation time and when an element expires. |
| | The maximum amount of time between accesses before an element expires |
| | Whether the disk store persists between restarts of the Virtual Machine. |
| | The number of seconds between runs of the disk expiry thread. The default value |
| | Camel 2.3: If you want to use a custom factory which instantiates and creates the EHCache |
Sending/Receiving Messages to/from the cache
Message Headers
Header | Description |
---|---|
| The operation to be performed on the cache. The valid options are
|
| The cache key used to store the Message in the cache. The cache key is optional if the CACHE_OPERATION is DELETEALL |
Cache Producer
Sending data to the cache involves the ability to direct payloads in exchanges to be stored in a pre-existing or created-on- demand cache. The mechanics of doing this involve
- setting the Message Exchange Headers shown above.
- ensuring that the Message Exchange Body contains the message directed to the cache
Cache Consumer
...
}} h3. Options {div:class=confluenceTableSmall} || Name || Default Value || Description || | {{maxElementsInMemory}} | {{1000}} | The numer of elements that may be stored in the defined cache | | {{memoryStoreEvictionPolicy}} | {{MemoryStoreEvictionPolicy.LFU}} | The number of elements that may be stored in the defined cache. Options include - MemoryStoreEvictionPolicy.LFU - Least frequently used - MemoryStoreEvictionPolicy.LRU - Least recently used - MemoryStoreEvictionPolicy.FIFO - first in first out, the oldest element by creation time | | {{overflowToDisk}} | {{true}} | Specifies whether cache may overflow to disk| | {{eternal}} | {{false}} | Sets whether elements are eternal. If eternal, timeouts are ignored and the element is never expired. | | {{timeToLiveSeconds}} | {{300}} | The maximum time between creation time and when an element expires. Is only used if the element is not eternal | | {{timeToIdleSeconds}} | {{300}} | The maximum amount of time between accesses before an element expires | | {{diskPersistent}} | {{true}} | Whether the disk store persists between restarts of the Virtual Machine. The default value is false. | | {{diskExpiryThreadIntervalSeconds}} | {{120}} | The number of seconds between runs of the disk expiry thread. The default value is 120 seconds | | {{cacheManagerFactory}} | {{null}} | *Camel 2.3:* If you want to use a custom factory which instantiates and creates the EHCache {{net.sf.ehcache.CacheManager}}. | {div} h3. Sending/Receiving Messages to/from the cache h4. Message Headers {div:class=confluenceTableSmall} || Header || Description || | {{CACHE_OPERATION}} | The operation to be performed on the cache. The valid options are - GET - CHECK - ADD - UPDATE - DELETE - DELETEALL The {{GET}} and {{CHECK}} requires *Camel 2.3* onwards. | | {{CACHE_KEY}} | The cache key used to store the Message in the cache. The cache key is optional if the CACHE_OPERATION is DELETEALL | {div} h4. Cache Producer Sending data to the cache involves the ability to direct payloads in exchanges to be stored in a pre-existing or created-on-demand cache. The mechanics of doing this involve - setting the Message Exchange Headers shown above. - ensuring that the Message Exchange Body contains the message directed to the cache h4. Cache Consumer Receiving data from the cache involves the ability of the CacheConsumer to listen on a pre-existing or created-on-demand Cache using an event Listener and receive automatic notifications when any cache activity take place (i.e ADD/UPDATE/DELETE/DELETEALL). Upon such an |
...
- an exchange containing Message Exchange Headers and a Message Exchange Body containing the just added/updated payload is placed and sent.
- in case of a DELETEALL operation, the Message Exchange Header CACHE_KEY and the Message Exchange Body are not populated.
Cache Processors
There are a set of nice processors with the ability to perform cache lookups and selectively replace payload content at the
- body
- token
- xpath level
Cache Usage Samples
Example 1: Configuring the cache
Code Block |
---|
activity taking place - an exchange containing Message Exchange Headers and a Message Exchange Body containing the just added/updated payload is placed and sent. - in case of a DELETEALL operation, the Message Exchange Header CACHE_KEY and the Message Exchange Body are not populated. h4. Cache Processors There are a set of nice processors with the ability to perform cache lookups and selectively replace payload content at the - body - token - xpath level h3. Cache Usage Samples h4. Example 1: Configuring the cache {code} from("cache://MyApplicationCache" + "?maxElementsInMemory=1000" + "&memoryStoreEvictionPolicy=" + "MemoryStoreEvictionPolicy.LFU" + "&overflowToDisk=true" + "&eternal=true" + "&timeToLiveSeconds=300" + "&timeToIdleSeconds=true" + "&diskPersistent=true" + "&diskExpiryThreadIntervalSeconds=300") |
...
{code} h4. Example 2: Adding keys to the cache |
...
{code |
} RouteBuilder builder = new RouteBuilder() { public void configure() { from("direct:start") .setHeader("CACHE_OPERATION", constant("ADD")) .setHeader("CACHE_KEY", constant("Ralph_Waldo_Emerson")) .to("cache://TestCache1") } }; |
...
{code} h4. Example 2: Updating existing keys in a cache |
...
{code |
} RouteBuilder builder = new RouteBuilder() { public void configure() { from("direct:start") .setHeader("CACHE_OPERATION", constant("UPDATE")) .setHeader("CACHE_KEY", constant("Ralph_Waldo_Emerson")) .to("cache://TestCache1") } }; |
...
{code} h4. Example 3: Deleting existing keys in a cache |
...
{code |
}
RouteBuilder builder = new RouteBuilder() {
public void configure() {
from("direct:start")
.setHeader("CACHE_OPERATION", constant("DELETE"))
.setHeader("CACHE_KEY", constant("Ralph_Waldo_Emerson"))
.to("cache://TestCache1")
}
};
|
...
{code} h4. Example 4: Deleting all existing keys in a cache |
...
{code |
} RouteBuilder builder = new RouteBuilder() { public void configure() { from("direct:start") .setHeader("CACHE_OPERATION", constant("DELETEALL")) .to("cache://TestCache1"); } }; {code} }; h4. Example 5: Notifying any changes registering in a Cache to Processors and other Producers |
...
{code |
}
RouteBuilder builder = new RouteBuilder() {
public void configure() {
from("cache://TestCache1")
.process(new Processor() {
public void process(Exchange exchange)
throws Exception {
String operation = (String) exchange.getIn().getHeader("CACHE_OPERATION");
String key = (String) exchange.getIn().getHeader("CACHE_KEY");
Object body = exchange.getIn().getBody();
// Do something
}
})
}
};
|
...
{code} h4. Example 6: Using Processors to selectively replace payload with cache values |
...
{code |
} RouteBuilder builder = new RouteBuilder() { public void configure() { //Message Body Replacer from("cache://TestCache1") .filter(header("CACHE_KEY").isEqualTo("greeting")) .process(new CacheBasedMessageBodyReplacer("cache://TestCache1","farewell")) .to("direct:next"); //Message Token replacer from("cache://TestCache1") .filter(header("CACHE_KEY").isEqualTo("quote")) .process(new CacheBasedTokenReplacer("cache://TestCache1","novel","#novel#")) .process(new CacheBasedTokenReplacer("cache://TestCache1","author","#author#")) .process(new CacheBasedTokenReplacer("cache://TestCache1","number","#number#")) .to("direct:next"); //Message XPath replacer from("cache://TestCache1"). .filter(header("CACHE_KEY").isEqualTo("XML_FRAGMENT")) .process(new CacheBasedXPathReplacer("cache://TestCache1","book1","/books/book1")) .process (new CacheBasedXPathReplacer("cache://TestCache1","book2","/books/book2")) .to("direct:next"); } }; |
...
{code} h4. Example 7: Getting an entry from the Cache |
...
{code |
}
from("direct:start")
// Prepare headers
.setHeader(CacheConstants.CACHE_OPERATION, constant(CacheConstants.CACHE_OPERATION_GET))
.setHeader(CacheConstants.CACHE_KEY, constant("Ralph_Waldo_Emerson")).
.to("cache://TestCache1").
// Check if entry was not found
.choice().when(header(CacheConstants.CACHE_ELEMENT_WAS_FOUND).isNull()).
// If not found, get the payload and put it to cache
.to("cxf:bean:someHeavyweightOperation").
.setHeader(CacheConstants.CACHE_OPERATION, constant(CacheConstants.CACHE_OPERATION_ADD))
.setHeader(CacheConstants.CACHE_KEY, constant("Ralph_Waldo_Emerson"))
.to("cache://TestCache1")
.end()
.to("direct:nextPhase");
|
...
{code} h4. Example 8: Checking for an entry in the Cache |
...
Note: CHECK command tests existence of the entry in the cache but doesn't place message to the body. |
...
{code |
} from("direct:start") // Prepare headers .setHeader(CacheConstants.CACHE_OPERATION, constant(CacheConstants.CACHE_OPERATION_CHECK)) .setHeader(CacheConstants.CACHE_KEY, constant("Ralph_Waldo_Emerson")). .to("cache://TestCache1"). // Check if entry was not found .choice().when(header(CacheConstants.CACHE_ELEMENT_WAS_FOUND).isNull()). // If not found, get the payload and put it to cache .to("cxf:bean:someHeavyweightOperation"). .setHeader(CacheConstants.CACHE_OPERATION, constant(CacheConstants.CACHE_OPERATION_ADD)) .setHeader(CacheConstants.CACHE_KEY, constant("Ralph_Waldo_Emerson")) .to("cache://TestCache1") .end(); {code} |