Repository: camel Updated Branches: refs/heads/master 940334b67 -> 4125e5891
Added camel-cache docs to gitbook Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/4125e589 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/4125e589 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/4125e589 Branch: refs/heads/master Commit: 4125e589187142287ecf9dca368ddc8b29b663f7 Parents: 940334b Author: Andrea Cosentino <anco...@gmail.com> Authored: Thu Feb 11 13:16:17 2016 +0100 Committer: Andrea Cosentino <anco...@gmail.com> Committed: Thu Feb 11 13:16:44 2016 +0100 ---------------------------------------------------------------------- components/camel-cache/src/main/docs/cache.adoc | 506 +++++++++++++++++++ docs/user-manual/en/SUMMARY.md | 1 + 2 files changed, 507 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/4125e589/components/camel-cache/src/main/docs/cache.adoc ---------------------------------------------------------------------- diff --git a/components/camel-cache/src/main/docs/cache.adoc b/components/camel-cache/src/main/docs/cache.adoc new file mode 100644 index 0000000..7e19032 --- /dev/null +++ b/components/camel-cache/src/main/docs/cache.adoc @@ -0,0 +1,506 @@ +[[Cache-CacheComponent]] +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, use the processors defined for the +cache component. + +Maven users will need to add the following dependency to their `pom.xml` +for this component: + +[source,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> +------------------------------------------------------------ + +[[Cache-URIformat]] +URI format +^^^^^^^^^^ + +[source,java] +--------------------------- +cache://cacheName[?options] +--------------------------- + +You can append query options to the URI in the following format, +`?option=value&option=#beanRef&...` + +[[Cache-Options]] +Options +^^^^^^^ + +[width="100%",cols="10%,10%,80%",options="header",] +|======================================================================= +|Name |Default Value |Description + +|`maxElementsInMemory` |`1000` |The number 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 never expires. + +|`timeToLiveSeconds` |`300` |The maximum time between creation time and when an element expires. + + Is used only if the element is not eternal + +|`timeToIdleSeconds` |`300` |The maximum amount of time between accesses before an element expires + +|`diskPersistent` |`false` |Whether the disk store persists between restarts of the Virtual Machine. + +|`diskExpiryThreadIntervalSeconds` |`120` |The number of seconds between runs of the disk expiry thread. + +|`cacheManagerFactory` |`null` |*Camel 2.8:* If you want to use a custom factory which instantiates and +creates the EHCache `net.sf.ehcache.CacheManager`. + _Type:_ abstract org.apache.camel.component.cache.CacheManagerFactory + +|`eventListenerRegistry` |`null` |*Camel 2.8:* Sets a list of EHCache +`net.sf.ehcache.event.CacheEventListener` for all new caches- no need to +define it per cache in EHCache xml config anymore. + _Type:_ org.apache.camel.component.cache.CacheEventListenerRegistry + +|`cacheLoaderRegistry` |`null` |*Camel 2.8:* Sets a list of +`org.apache.camel.component.cache.CacheLoaderWrapper` that extends +EHCache `net.sf.ehcache.loader.CacheLoader` for all new caches- no need +to define it per cache in EHCache xml config anymore. + _Type:_ org.apache.camel.component.cache.CacheLoaderRegistry + +|`key` |`null` |*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. + +|`operation` |`null` |*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-CacheComponentoptions]] +Cache Component options +^^^^^^^^^^^^^^^^^^^^^^^ + +[width="100%",cols="10%,10%,80%",options="header",] +|======================================================================= +|Name |Default Value |Description + +|`configuration` | | To use a custom `org.apache.camel.component.cache.CacheConfiguration` +configuration. + +|`cacheManagerFactory` | | To use a custom `org.apache.camel.component.cache.CacheManagerFactory`. + +|`configurationFile` | | *Camel 2.13/2.12.3:* To configure the location of the `ehcache.xml` file +to use, such as `classpath:com/foo/mycache.xml` to load from classpath. +If no configuration is given, then the default settings from EHCache is +used. +|======================================================================= + +[[Cache-SendingReceivingMessagestofromthecache]] +Sending/Receiving Messages to/from the cache +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +[[Cache-MessageHeadersuptoCamel2.7]] +Message Headers up to Camel 2.7 ++++++++++++++++++++++++++++++++ + +[width="100%",cols="20%,80%",options="header",] +|======================================================================= +|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 +|======================================================================= +[[Cache-MessageHeadersCamel2.8]] +Message Headers Camel 2.8+ +++++++++++++++++++++++++++ + +[Info] +==== +Header changes in Camel 2.8 + +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. + +==== + +[width="100%",cols="20%,80%",options="header",] +|======================================================================= +|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 +|======================================================================= + +The `CamelCacheAdd` and `CamelCacheUpdate` operations support additional +headers: + +[width="100%",cols="10%,10%,80%",options="header",] +|======================================================================= +|Header |Type |Description + +|`CamelCacheTimeToLive` |`Integer` |*Camel 2.11:* Time to live in seconds. + +|`CamelCacheTimeToIdle` |`Integer` |*Camel 2.11:* Time to idle in seconds. + +|`CamelCacheEternal` |`Boolean` |*Camel 2.11:* Whether the content is eternal. +|======================================================================= + +[[Cache-CacheProducer]] +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-CacheConsumer]] +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 +CamelCacheGet/CamelCacheUpdate/CamelCacheDelete/CamelCacheDeleteAll). +Upon such an 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 CamelCacheDeleteAll operation, the Message Exchange +Header CamelCacheKey and the Message Exchange Body are not populated. + +[[Cache-CacheProcessors]] +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-CacheUsageSamples]] +Cache Usage Samples +^^^^^^^^^^^^^^^^^^^ + +[[Cache-Example1:Configuringthecache]] +Example 1: Configuring the cache +++++++++++++++++++++++++++++++++ + +[source,java] +------------------------------------------------- +from("cache://MyApplicationCache" + + "?maxElementsInMemory=1000" + + "&memoryStoreEvictionPolicy=" + + "MemoryStoreEvictionPolicy.LFU" + + "&overflowToDisk=true" + + "&eternal=true" + + "&timeToLiveSeconds=300" + + "&timeToIdleSeconds=true" + + "&diskPersistent=true" + + "&diskExpiryThreadIntervalSeconds=300") +------------------------------------------------- + +[[Cache-Example2:Addingkeystothecache]] +Example 2: Adding keys to the cache ++++++++++++++++++++++++++++++++++++ + +[source,java] +--------------------------------------------------------------------------------------------- +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") + } +}; +--------------------------------------------------------------------------------------------- + +[[Cache-Example2:Updatingexistingkeysinacache]] +Example 2: Updating existing keys in a cache +++++++++++++++++++++++++++++++++++++++++++++ + +[source,java] +------------------------------------------------------------------------------------------------ +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") + } +}; +------------------------------------------------------------------------------------------------ + +[[Cache-Example3:Deletingexistingkeysinacache]] +Example 3: Deleting existing keys in a cache +++++++++++++++++++++++++++++++++++++++++++++ + +[source,java] +-------------------------------------------------------------------------------------- +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") + } +}; +-------------------------------------------------------------------------------------- + +[[Cache-Example4:Deletingallexistingkeysinacache]] +Example 4: Deleting all existing keys in a cache +++++++++++++++++++++++++++++++++++++++++++++++++ + +[source,java] +----------------------------------------------------------------------------------------- +RouteBuilder builder = new RouteBuilder() { + public void configure() { + from("direct:start") + .setHeader(CacheConstants.CACHE_OPERATION, constant(CacheConstants.CACHE_DELETEALL)) + .to("cache://TestCache1"); + } +}; +----------------------------------------------------------------------------------------- + +[[Cache-Example5:NotifyinganychangesregisteringinaCachetoProcessorsandotherProducers]] +Example 5: Notifying any changes registering in a Cache to Processors and other Producers ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +[source,java] +-------------------------------------------------------------------------------------------------- +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 + } + }) + } +}; +-------------------------------------------------------------------------------------------------- + +[[Cache-Example6:UsingProcessorstoselectivelyreplacepayloadwithcachevalues]] +Example 6: Using Processors to selectively replace payload with cache values +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +[source,java] +--------------------------------------------------------------------------------------- +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"); + } +}; +--------------------------------------------------------------------------------------- + +[[Cache-Example7:GettinganentryfromtheCache]] +Example 7: Getting an entry from the Cache +++++++++++++++++++++++++++++++++++++++++++ + +[source,java] +------------------------------------------------------------------------------------------------ +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"); +------------------------------------------------------------------------------------------------ + +[[Cache-Example8:CheckingforanentryintheCache]] +Example 8: Checking for an entry in the Cache ++++++++++++++++++++++++++++++++++++++++++++++ + +Note: The CHECK command tests existence of an entry in the cache but +doesn't place a message in the body. + +[source,java] +------------------------------------------------------------------------------------------------ +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(); +------------------------------------------------------------------------------------------------ + +[[Cache-ManagementofEHCache]] +Management of EHCache +^^^^^^^^^^^^^^^^^^^^^ + +http://ehcache.org/[EHCache] has its own statistics and management from +link:camel-jmx.html[JMX]. + +Here's a snippet on how to expose them via JMX in a Spring application +context: + +[source,xml] +----------------------------------------------------------------------------------------------------------------------------- +<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: + +[source,java] +-------------------------------------------------------------------------------------------------- +ManagementService.registerMBeans(CacheManager.getInstance(), mbeanServer, true, true, true, true); +-------------------------------------------------------------------------------------------------- + +You can get cache hits, misses, in-memory hits, disk hits, size stats +this way. You can also change CacheConfiguration parameters on the fly. + +[[Cache-CachereplicationCamel2.8]] +Cache replication Camel 2.8 +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The Camel Cache component is able to distribute a cache across server +nodes using several different replication mechanisms including: RMI, +JGroups, JMS and Cache Server. + +There are two different ways to make it work: + +*1.* You can configure `ehcache.xml` manually + +OR + +*2.* You can configure these three options: + +* cacheManagerFactory +* eventListenerRegistry +* cacheLoaderRegistry + +Configuring Camel Cache replication using the first option is a bit of +hard work as you have to configure all caches separately. So in a +situation when the all names of caches are not known, using +`ehcache.xml` is not a good idea. + +The second option is much better when you want to use many different +caches as you do not need to define options per cache. This is because +replication options are set per `CacheManager` and per `CacheEndpoint`. +Also it is the only way when cache names are not know at the development +phase. + +[Note] +==== + + +It might be useful to read the http://ehcache.org/documentation[EHCache +manual] to get a better understanding of the Camel Cache replication +mechanism. + +==== + +[[Cache-Example:JMScachereplication]] +Example: JMS cache replication +++++++++++++++++++++++++++++++ + +JMS replication is the most powerful and secured replication method. +Used together with Camel Cache replication makes it also rather +simple. An example is available on link:cachereplicationjmsexample.html[a +separate page]. + http://git-wip-us.apache.org/repos/asf/camel/blob/4125e589/docs/user-manual/en/SUMMARY.md ---------------------------------------------------------------------- diff --git a/docs/user-manual/en/SUMMARY.md b/docs/user-manual/en/SUMMARY.md index 9b37bbf..070ac7d 100644 --- a/docs/user-manual/en/SUMMARY.md +++ b/docs/user-manual/en/SUMMARY.md @@ -100,6 +100,7 @@ * [Boon](boon.adoc) * [Box](box.adoc) * [Braintree](braintree.adoc) + * [Cache](cache.adoc) * [CDI](cdi.adoc) * [JMS](jms.adoc) * [Metrics](metrics.adoc)