[[jcache-component]]
= JCache Component
:page-source: components/camel-jcache/src/main/docs/jcache-component.adoc

*Since Camel 2.17*

// HEADER START
*Both producer and consumer is supported*
// HEADER END

The JCache component enables you to perform caching operations using JSR107/JCache as cache implementation.

== URI Format

[source,java]
----------------------------
jcache:cacheName[?options]
----------------------------

== URI Options

// endpoint options: START
The JCache endpoint is configured using URI syntax:

----
jcache:cacheName
----

with the following path and query parameters:

=== Path Parameters (1 parameters):


[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *cacheName* | *Required* The name of the cache |  | String
|===


=== Query Parameters (24 parameters):


[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *cacheConfiguration* (common) | A Configuration for the Cache |  | Configuration
| *cacheConfigurationProperties* (common) | The Properties for the javax.cache.spi.CachingProvider to create the CacheManager |  | Properties
| *cachingProvider* (common) | The fully qualified class name of the javax.cache.spi.CachingProvider |  | String
| *configurationUri* (common) | An implementation specific URI for the CacheManager |  | String
| *managementEnabled* (common) | Whether management gathering is enabled | false | boolean
| *readThrough* (common) | If read-through caching should be used | false | boolean
| *statisticsEnabled* (common) | Whether statistics gathering is enabled | false | boolean
| *storeByValue* (common) | If cache should use store-by-value or store-by-reference semantics | true | boolean
| *writeThrough* (common) | If write-through caching should be used | false | 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
| *filteredEvents* (consumer) | Events a consumer should filter. If using filteredEvents option, then eventFilters one will be ignored |  | List
| *oldValueRequired* (consumer) | if the old value is required for events | false | boolean
| *synchronous* (consumer) | if the event listener should block the thread causing the event | false | boolean
| *eventFilters* (consumer) | The CacheEntryEventFilter. If using eventFilters option, then filteredEvents one will be ignored |  | List
| *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 using a cache operation by default. If an operation in the message header, then the operation from the header takes precedence. |  | String
| *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and starting the producer may take a little time and prolong the total processing time of the processing. | false | boolean
| *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
| *cacheLoaderFactory* (advanced) | The CacheLoader factory |  | Factory
| *cacheWriterFactory* (advanced) | The CacheWriter factory |  | Factory
| *createCacheIfNotExists* (advanced) | Configure if a cache need to be created if it does exist or can't be pre-configured. | true | boolean
| *expiryPolicyFactory* (advanced) | The ExpiryPolicy factory |  | Factory
| *lookupProviders* (advanced) | Configure if a camel-cache should try to find implementations of jcache api in runtimes like OSGi. | false | boolean
|===
// endpoint options: END
// spring-boot-auto-configure options: START
== Spring Boot Auto-Configuration

When using Spring Boot make sure to use the following Maven dependency to have support for auto configuration:

[source,xml]
----
<dependency>
  <groupId>org.apache.camel.springboot</groupId>
  <artifactId>camel-jcache-starter</artifactId>
  <version>x.x.x</version>
  <!-- use the same version as your Camel core version -->
</dependency>
----


The component supports 8 options, which are listed below.



[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *camel.component.jcache.basic-property-binding* | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | Boolean
| *camel.component.jcache.bridge-error-handler* | 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
| *camel.component.jcache.cache-configuration* | A Configuration for the Cache. The option is a javax.cache.configuration.Configuration type. |  | String
| *camel.component.jcache.cache-configuration-properties* | The Properties for the javax.cache.spi.CachingProvider to create the CacheManager. The option is a java.util.Properties type. |  | String
| *camel.component.jcache.caching-provider* | The fully qualified class name of the javax.cache.spi.CachingProvider |  | String
| *camel.component.jcache.configuration-uri* | An implementation specific URI for the CacheManager |  | String
| *camel.component.jcache.enabled* | Whether to enable auto configuration of the jcache component. This is enabled by default. |  | Boolean
| *camel.component.jcache.lazy-start-producer* | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and starting the producer may take a little time and prolong the total processing time of the processing. | false | Boolean
|===
// spring-boot-auto-configure options: END









// component options: START
The JCache component supports 7 options, which are listed below.



[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *cachingProvider* (common) | The fully qualified class name of the javax.cache.spi.CachingProvider |  | String
| *cacheConfiguration* (common) | A Configuration for the Cache |  | Configuration
| *cacheConfiguration Properties* (common) | The Properties for the javax.cache.spi.CachingProvider to create the CacheManager |  | Properties
| *configurationUri* (common) | An implementation specific URI for the CacheManager |  | String
| *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
| *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and starting the producer may take a little time and prolong the total processing time of the processing. | false | 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
|===
// component options: END

== JCache Policy

The JCachePolicy is an interceptor around a route that caches the "result of the route" - the message body - after the route is completed.
  If next time the route is called with a "similar" Exchange, the cached value is used on the Exchange instead of executing the route.
  The policy uses the JSR107/JCache API of a cache implementation, so it's required to add one (e.g. Hazelcast, Ehcache) to the classpath.

The policy takes a _key_ value from the received Exchange to get or store values in the cache. By default the _key_ is the message body.
  For example if the route - having a JCachePolicy - receives an Exchange with a String body "fruit" and the body at the
  end of the route is "apple", it stores a _key/value_ pair "fruit=apple" in the cache. If next time another Exchange arrives
  with a body "fruit", the value "apple" is taken from the cache instead of letting the route process the Exchange.

So by default the message body at the beginning of the route is the cache _key_ and the body at the end is the stored _value_.
  It's possible to use something else as _key_ by setting a Camel Expression via _.setKeyExpression()_
  that will be used to determine the key.

The policy needs a JCache Cache. It can be set directly by _.setCache()_ or the policy will try to get or create the Cache
  based on the other parameters set.

Similar caching solution is available for example in Spring using the @Cacheable annotation.

== JCachePolicy Fields


[width="100%",cols="2,5,3,2",options="header"]
|===
| Name | Description | Default | Type
| *cache* | The Cache to use to store the cached values. If this value is set, _cacheManager_, _cacheName_ and _cacheConfiguration_ is ignored. |  | Cache
| *cacheManager* | The CacheManager to use to lookup or create the Cache. Used only if _cache_ is not set. | Try to find a CacheManager in CamelContext registry or calls the standard JCache _Caching.getCachingProvider().getCacheManager()_. | CacheManager
| *cacheName* | Name of the cache. Get the Cache from cacheManager or create a new one if it doesn't exist. | RouteId of the route. | String
| *cacheConfiguration* | JCache cache configuration to use if a new Cache is created | Default new _MutableConfiguration_ object. | CacheConfiguration
| *keyExpression* | An Expression to evaluate to determine the cache key. | Exchange body | Expression
| *enabled* | If policy is not enabled, no wrapper processor is added to the route. It has impact only during startup, not during runtime. For example it can be used to disable caching from properties. | true | boolean
|===

== How to determine cache to use?


== Set cache

The cache used by the policy can be set directly. This means you have to configure the cache yourself and get a JCache Cache object,
 but this gives the most flexibility. For example it can be setup in the config xml of the cache provider (Hazelcast, EhCache, ...)
 and used here. Or it's possible to use the standard Caching API as below:


[source,java]
----------------------------
MutableConfiguration configuration = new MutableConfiguration<>();
configuration.setTypes(String.class, Object.class);
configuration.setExpiryPolicyFactory(CreatedExpiryPolicy.factoryOf(new Duration(TimeUnit.MINUTES, 60)));
CacheManager cacheManager = Caching.getCachingProvider().getCacheManager();
Cache cache = cacheManager.createCache("orders",configuration);

JCachePolicy jcachePolicy = new JCachePolicy();
jcachePolicy.setCache(cache);

from("direct:get-orders")
    .policy(jcachePolicy)
    .log("Getting order with id: ${body}")
    .bean(OrderService.class,"findOrderById(${body})");
----------------------------

== Set cacheManager

If the _cache_ is not set, the policy will try to lookup or create the cache automatically.
 If the _cacheManager_ is set on the policy, it will try to get cache with the set _cacheName_ (routeId by default) from the CacheManager.
 Is the cache does not exist it will create a new one using the _cacheConfiguration_ (new MutableConfiguration by default).

[source,java]
----------------------------
//In a Spring environment for example the CacheManager may already exist as a bean
@Autowire
CacheManager cacheManager;
...

//Cache "items" is used or created if not exists
JCachePolicy jcachePolicy = new JCachePolicy();
jcachePolicy.setCacheManager(cacheManager);
jcachePolicy.setCacheName("items")
----------------------------

== Find cacheManager

If _cacheManager_ (and the _cache_) is not set, the policy will try to find a JCache CacheManager object:

* Lookup a CacheManager in Camel registry - that falls back on JNDI or Spring context based on the environment
* Use the standard api _Caching.getCachingProvider().getCacheManager()_

[source,java]
----------------------------
//A Cache "getorders" will be used (or created) from the found CacheManager
from("direct:get-orders").routeId("getorders")
    .policy(new JCachePolicy())
    .log("Getting order with id: ${body}")
    .bean(OrderService.class,"findOrderById(${body})");
----------------------------

== Partially wrapped route

In the examples above the whole route was executed or skipped. A policy can be used to wrap only a segment of the route instead of all processors.

[source,java]
----------------------------
from("direct:get-orders")
    .log("Order requested: ${body}")
    .policy(new JCachePolicy())
        .log("Getting order with id: ${body}")
        .bean(OrderService.class,"findOrderById(${body})")
    .end()
    .log("Order found: ${body}");
----------------------------

The _.log()_ at the beginning and at the end of the route is always called, but the section inside _.policy()_ and _.end()_ is executed based on the cache.

== KeyExpression

By default the policy uses the received Exchange body as _key_, so the default expression is like _simple("$\{body\})_.
 We can set a different Camel Expression as _keyExpression_ which will be evaluated to determine the key.
 For example if we try to find an _order_ by an _orderId_ which is in the message headers,
 set _header("orderId")_ (or _simple("${header.orderId})_ as _keyExpression_.

The expression is evaluated only once at the beginning of the route to determine the _key_. If nothing was found in cache,
 this _key_ is used to store the _value_ in cache at the end of the route.

[source,java]
----------------------------
MutableConfiguration configuration = new MutableConfiguration<>();
configuration.setTypes(String.class, Order.class);
configuration.setExpiryPolicyFactory(CreatedExpiryPolicy.factoryOf(new Duration(TimeUnit.MINUTES, 10)));

JCachePolicy jcachePolicy = new JCachePolicy();
jcachePolicy.setCacheConfiguration(configuration);
jcachePolicy.setCacheName("orders")
jcachePolicy.setKeyExpression(simple("${header.orderId}))

//The cache key is taken from "orderId" header.
from("direct:get-orders")
    .policy(jcachePolicy)
    .log("Getting order with id: ${header.orderId}")
    .bean(OrderService.class,"findOrderById(${header.orderId})");
----------------------------

== Camel XML DSL examples

== Use JCachePolicy in an XML route

In Camel XML DSL we need a named reference to the JCachePolicy instance (registered in CamelContext or simply in Spring).
 We have to wrap the route between <policy>...</policy> tags after <from>.

[source,xml]
----------------------------
<camelContext xmlns="http://camel.apache.org/schema/spring">
    <route>
        <from uri="direct:get-order"/>
        <policy ref="jCachePolicy" >
            <setBody>
                <method ref="orderService" method="findOrderById(${body})"/>
            </setBody>
        </policy>
    </route>
</camelContext>
----------------------------

See this example when only a part of the route is wrapped:

[source,xml]
----------------------------
<camelContext xmlns="http://camel.apache.org/schema/spring">
    <route>
        <from uri="direct:get-order"/>
        <log message="Start - This is always called. body:${body}"/>
        <policy ref="jCachePolicy" >
            <log message="Executing route, not found in cache. body:${body}"/>
            <setBody>
                <method ref="orderService" method="findOrderById(${body})"/>
            </setBody>
        </policy>
        <log message="End - This is always called. body:${body}"/>
    </route>
</camelContext>
----------------------------


== Define CachePolicy in Spring

It's more convenient to create a JCachePolicy in Java especially within a RouteBuilder using the Camel DSL expressions,
 but see this example to define it in a Spring XML:

[source,xml]
----------------------------
<bean id="jCachePolicy" class="org.apache.camel.component.jcache.policy.JCachePolicy">
    <property name="cacheName" value="spring"/>
    <property name="keyExpression">
        <bean class="org.apache.camel.model.language.SimpleExpression">
            <property name="expression" value="${header.mykey}"/>
        </bean>
    </property>
</bean>
----------------------------

== Create Cache from XML

It's not strictly speaking related to Camel XML DLS, but JCache providers usually have a way to configure the cache in an XML file.
 For example with Hazelcast you can add a _hazelcast.xml_ to classpath to configure the cache "spring" used in the example above.

[source,xml]
----------------------------
<?xml version="1.0" encoding="UTF-8"?>
<hazelcast xmlns="http://www.hazelcast.com/schema/config"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.hazelcast.com/schema/config hazelcast-config-3.11.xsd" >

    <cache name="spring">
        <key-type class-name="java.lang.String"/>
        <value-type class-name="java.lang.String"/>
        <expiry-policy-factory>
            <timed-expiry-policy-factory expiry-policy-type="CREATED" duration-amount="60" time-unit="MINUTES"/>
        </expiry-policy-factory>
    </cache>

</hazelcast>
----------------------------


== Special scenarios and error handling

If the Cache used by the policy is closed (can be done dynamically), the whole caching functionality is skipped,
 the route will be executed every time.

If the determined _key_ is _null_, nothing is looked up or stored in cache.

In case of an exception during the route, the error handled is called as always. If the exception gets _handled()_,
 the policy stores the Exchange body, otherwise nothing is added to the cache.
 If an exception happens during evaluating the keyExpression, the routing fails, the error handler is called as normally.
