Cache Component
Warning |
---|
This component is deprecated. As of Camel 2.18.0 You should use Ehcache. |
Available as of Camel 2.1
...
Maven users will need to add the following dependency to their pom.xml
for this component:
Code Block | ||||
---|---|---|---|---|
| ||||
<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 |
---|
cache://cacheName[?options]
|
You can append query options to the URI in the following format, ?option=value&option=#beanRef&...
Options
...
Name | Default Value | Description |
---|---|---|
|
| The number 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. |
|
| Camel 2.8: If you want to use a custom factory which instantiates and creates the EHCache |
...
org.apache.camel.component.cache.CacheManagerFactory |
...
|
| Camel 2.8: |
...
Sets a |
...
list |
...
of |
...
EHCache |
...
|
...
for |
...
all |
...
new |
...
caches |
...
- |
...
no |
...
need |
...
to |
...
define |
...
it |
...
per |
...
cache |
...
in |
...
EHCache |
...
xml |
...
config |
...
anymore. |
...
|
...
org.apache.camel.component.cache.CacheEventListenerRegistry |
...
|
| Camel 2.8: |
...
Sets |
...
a |
...
list |
...
of |
...
|
...
that |
...
extends |
...
EHCache |
...
|
...
for |
...
all |
...
new |
...
caches |
...
- |
...
no |
...
need |
...
to |
...
define |
...
it |
...
per |
...
cache |
...
in |
...
EHCache |
...
xml |
...
config |
...
anymore. |
...
|
...
org.apache.camel.component.cache.CacheLoaderRegistry |
...
|
| Camel 2.10: |
...
To |
...
configure |
...
using |
...
a |
...
cache |
...
key |
...
by |
...
default. |
...
If |
...
a |
...
key |
...
is |
...
provided |
...
in |
...
the |
...
message |
...
header, |
...
then |
...
the |
...
key |
...
from |
...
the |
...
header |
...
takes |
...
precedence. |
...
|
| Camel 2.10: |
...
To |
...
configure |
...
using |
...
an |
...
cache |
...
operation |
...
by |
...
default. |
...
If |
...
an |
...
operation |
...
in |
...
the |
...
message |
...
header, |
...
then |
...
the |
...
operation |
...
from |
...
the |
...
header |
...
takes |
...
precedence. |
...
objectCache | false | Camel 2.15: Whether to turn on allowing to store non serializable objects in the cache. If this option is enabled then overflow to disk cannot be enabled as well. |
Cache Component options
Name | Default Value | Description |
---|---|---|
|
| To use a custom |
|
| To use a custom |
|
| Camel 2.13/2.12.3: To configure the location of the |
Sending/Receiving Messages to/from the cache
Message Headers up to Camel 2.7
Div | ||||||
---|---|---|---|---|---|---|
| ||||||
|
Sending/Receiving Messages to/from the cache
Message Headers up to Camel 2.7
Wiki Markup | |
---|---|
{div:class=confluenceTableSmall}
|| Header || Description ||
| {{CACHE_OPERATION}} | The operation to be performed on the cache. Valid options are
- GET
- CHECK
- ADD
- UPDATE
- DELETE
- DELETEALL\\
{{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} |
Message Headers Camel 2.8+
Info | ||
---|---|---|
| ||
The header names and supported values have changed to be prefixed with 'CamelCache' and use mixed case. This makes them easier to identify and keep separate from other headers. The CacheConstants variable names remain unchanged, just their values have been changed. Also, these headers are now removed from the exchange after the cache operation is performed. |
Div | ||||||
---|---|---|---|---|---|---|
| ||||||
| ||||||
Wiki Markup | ||||||
{div:class=confluenceTableSmall}
|| Header || Description ||
| {{CamelCacheOperation}} | The operation to be performed on the cache. The valid options are
- CamelCacheGet
- CamelCacheCheck
- CamelCacheAdd
- CamelCacheUpdate
- CamelCacheDelete
- CamelCacheDeleteAll |
| {{CamelCacheKey}} | The cache key used to store the Message in the cache. The cache key is optional if the CamelCacheOperation is CamelCacheDeleteAll |
{div} |
The CamelCacheAdd
and CamelCacheUpdate
operations support additional headers:
Div | |||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |||||||||||||||||||||||||
| |||||||||||||||||||||||||
Wiki Markup | |||||||||||||||||||||||||
{div:class=confluenceTableSmall}
|| Header || Type || Description ||
| {{CamelCacheTimeToLive}} | {{Integer}} | *Camel
|
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
...
Example 1: Configuring the cache
Code Block |
---|
from("cache://MyApplicationCache" +
"?maxElementsInMemory=1000" +
"&memoryStoreEvictionPolicy=" +
"MemoryStoreEvictionPolicy.LFU" +
"&overflowToDisk=true" +
"&eternal=true" +
"&timeToLiveSeconds=300" +
"&timeToIdleSeconds=true" +
"&diskPersistent=true" +
"&diskExpiryThreadIntervalSeconds=300")
|
Example 2: Adding keys to the cache
Code Block |
---|
RouteBuilder builder = new RouteBuilder() {
public void configure() {
from("direct:start")
.setHeader(CacheConstants.CACHE_OPERATION, constant(CacheConstants.CACHE_OPERATION_ADD))
.setHeader(CacheConstants.CACHE_KEY, constant("Ralph_Waldo_Emerson"))
.to("cache://TestCache1")
}
};
|
Example 2: Updating existing keys in a cache
Code Block |
---|
RouteBuilder builder = new RouteBuilder() {
public void configure() {
from("direct:start")
.setHeader(CacheConstants.CACHE_OPERATION, constant(CacheConstants.CACHE_OPERATION_UPDATE))
.setHeader(CacheConstants.CACHE_KEY, constant("Ralph_Waldo_Emerson"))
.to("cache://TestCache1")
}
};
|
Example 3: Deleting existing keys in a cache
Code Block |
---|
RouteBuilder builder = new RouteBuilder() {
public void configure() {
from("direct:start")
.setHeader(CacheConstants.CACHE_OPERATION, constant(CacheConstants.CACHE_DELETE))
.setHeader(CacheConstants.CACHE_KEY", constant("Ralph_Waldo_Emerson"))
.to("cache://TestCache1")
}
};
|
Example 4: Deleting all existing keys in a cache
Code Block |
---|
RouteBuilder builder = new RouteBuilder() {
public void configure() {
from("direct:start")
.setHeader(CacheConstants.CACHE_OPERATION, constant(CacheConstants.CACHE_DELETEALL))
.to("cache://TestCache1");
}
};
|
Example 5: Notifying any changes registering in a Cache to Processors and other Producers
Code Block |
---|
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(CacheConstants.CACHE_OPERATION);
String key = (String) exchange.getIn().getHeader(CacheConstants.CACHE_KEY);
Object body = exchange.getIn().getBody();
// Do something
}
})
}
};
|
Example 6: Using Processors to selectively replace payload with cache values
Code Block |
---|
RouteBuilder builder = new RouteBuilder() {
public void configure() {
//Message Body Replacer
from("cache://TestCache1")
.filter(header(CacheConstants.CACHE_KEY).isEqualTo("greeting"))
.process(new CacheBasedMessageBodyReplacer("cache://TestCache1","farewell"))
.to("direct:next");
//Message Token replacer
from("cache://TestCache1")
.filter(header(CacheConstants.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(CacheConstants.CACHE_KEY).isEqualTo("XML_FRAGMENT"))
.process(new CacheBasedXPathReplacer("cache://TestCache1","book1","/books/book1"))
.process (new CacheBasedXPathReplacer("cache://TestCache1","book2","/books/book2"))
.to("direct:next");
}
};
|
Example 7: Getting an entry from the Cache
Code Block |
---|
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");
|
...
Note: The CHECK command tests existence of an entry in the cache but doesn't place a message in the body.
Code Block |
---|
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();
|
...
Here's a snippet on how to expose them via JMX in a Spring application context:
Code Block | ||||
---|---|---|---|---|
| ||||
<bean id="ehCacheManagementService" class="net.sf.ehcache.management.ManagementService" init-method="init" lazy-init="false">
<constructor-arg>
<bean class="net.sf.ehcache.CacheManager" factory-method="getInstance"/>
</constructor-arg>
<constructor-arg>
<bean class="org.springframework.jmx.support.JmxUtils" factory-method="locateMBeanServer"/>
</constructor-arg>
<constructor-arg value="true"/>
<constructor-arg value="true"/>
<constructor-arg value="true"/>
<constructor-arg value="true"/>
</bean>
|
Of course you can do the same thing in straight Java:
Code Block | ||||
---|---|---|---|---|
| ||||
ManagementService.registerMBeans(CacheManager.getInstance(), mbeanServer, true, true, true, true);
|
...