com.atlassian.confluence.content.render.xhtml.migration.exceptions.UnknownMacroMigrationException: The macro 'next_previous_links' is unknown.

Cache Mediator

When a message enters a message flow, the Cache mediator checks whether the incoming message is similar to a previous message that was received within a specified period of time. This is done by evaluating the hash value of incoming messages. If a similar message was identified before, the Cache mediator executes the onCacheHit sequence (if specified), fetches the cached response, and prepares the ESB profile to send the response. The onCacheHit sequence can send back the response message using the Respond Mediator. If the onCacheHit sequence is not specified, the cached response is sent back to the requester and the message is not passed on. If a similar message has not been seen before, then the message is passed on.

The Cache mediator is a content-aware mediator.

The Cache mediator supports only local caching. It does not support distributed caching.




Syntax

<cache [timeout="seconds"] [collector=(true | false)] [maxMessageSize="in-bytes"] >
   <onCacheHit [sequence="key"]>
 	(mediator)+
   </onCacheHit>?
   <protocol type="http" >?
	 <methods>comma separated list</methods>
     <headersToExcludeInHash>comma separated list</headersToExcludeInHash>
	 <responseCodes>regular expression</responseCodes>
     <enableCacheControl>(true | false)</enableCacheControl>
     <includeAgeHeader>(true | false)</includeAgeHeader>
	 <hashGenerator>class</hashGenerator>
   </protocol>	
   <implementation [maxSize="int"]/>
</cache>

Note

In a message flow you can use the cache mediator as a finder (in the incoming path to check the request) or as a collector (in the outgoing path to cache the response).

It is not possible to have more than one cache mediator in the same message flow because mediation is terminated after the finder on a cache hit, and the response is not passed on to the next finder after a cache hit.


Following is an example where the expected response from the last cache hit is not received because the response is sent once the request comes to the first finder:

<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse" name="cache115" transports="http https" startOnLoad="true">
   <description />
   <target>
      <inSequence>
         <cache collector="false" timeout="60">
            <protocol type="HTTP">
               <methods>POST</methods>
               <headersToExcludeInHash />
               <responseCodes>.*</responseCodes>
               <enableCacheControl>false</enableCacheControl>
               <includeAgeHeader>false</includeAgeHeader>
               <hashGenerator>org.wso2.carbon.mediator.cache.digest.HttpRequestHashGenerator</hashGenerator>
            </protocol>
         </cache>
         <call>
            <endpoint>
               <address uri="http://demo0585968.mockable.io/some" />
            </endpoint>
         </call>
         <property name="RESPONSE" value="true" scope="default" type="STRING" />
         <log level="full" />
         <cache collector="true" />
         <property name="RESPONSE" value="false" scope="default" type="STRING" />
         <cache collector="false" timeout="60">
            <protocol type="HTTP">
               <methods>POST</methods>
               <headersToExcludeInHash />
               <responseCodes>.*</responseCodes>
               <hashGenerator>org.wso2.carbon.mediator.cache.digest.HttpRequestHashGenerator</hashGenerator>
            </protocol>
         </cache>
         <call>
            <endpoint>
               <address uri="http://demo0585968.mockable.io/hello" />
            </endpoint>
         </call>
         <property name="RESPONSE" value="true" scope="default" type="STRING" />
         <log level="full" />
         <cache collector="true" />
         <respond />
      </inSequence>
   </target>
</proxy>			



Configuration

Click on the relevant tab to view the UI configuration depending on whether the cache type of the cache mediator is Finder or Collector.

Examples

Following are examples of how you can use the Cache mediator.

Example one

According to this example configuration, when the first message is sent to the endpoint, the cache is not hit. The Cache mediator configured in the Out sequence caches the response to this message. When a similar message is sent to the endpoint for the second time, the previous response is directly fetched from the cache and sent to the requester. This happens because the onCacheHit sequence is not defined in this configuration.


<?xml version="1.0" encoding="UTF-8"?>
<sequence name="main">
    	<in>
        	<cache collector="false" maxMessageSize="10000" timeout="20">
            	<protocol type="HTTP">
                	<methods>POST</methods>
                	<headersToExcludeInHash/>
                	<responseCodes>2[0-9][0-9]</responseCodes>
                    <enableCacheControl>false</enableCacheControl>
                    <includeAgeHeader>false</includeAgeHeader>
                	<hashGenerator>org.wso2.carbon.mediator.cache.digest.HttpRequestHashGenerator</hashGenerator>
            	</protocol>
            	<implementation maxSize="100"/>
        	</cache>
        	<send>
            	<endpoint name="inlined">
                	<address uri="http://localhost:9000/services/SimpleStockQuoteService"/>
            	</endpoint>
        	</send>
    	</in>
    	<out>
        	<cache collector="true"/>
        	<send/>
    	</out>
	</sequence>

Example two

According to this example configuration, if you define a cache collector using the cache mediator in the in sequence, you need to add the RESPONSE property to consider the message as a response message.

<?xml version="1.0" encoding="UTF-8"?>
<api xmlns="http://ws.apache.org/ns/synapse" name="cacheAPI" context="/cache">
<resource methods="POST GET" uri-template="/headerapi/*">
	<inSequence>
		<cache collector="false" timeout="5000">
			<protocol type="HTTP">
				<methods>GET, POST</methods>
				<headersToExcludeInHash>*</headersToExcludeInHash>
				<responseCodes>.*</responseCodes>
                <enableCacheControl>false</enableCacheControl>
                <includeAgeHeader>false</includeAgeHeader>
				<hashGenerator>org.wso2.carbon.mediator.cache.digest.HttpRequestHashGenerator</hashGenerator>
			</protocol>
		</cache>
		<call>
			<endpoint>
				<address uri="http://localhost:9000/services/SimpleStockQuoteService"/>
			</endpoint>
		</call>
		<property name="RESPONSE" value="true" scope="default" type="STRING"/>
		<enrich>
			<source type="inline" clone="true">
				<ax21:newvalue
					xmlns:ax21="http://services.samples/xsd">testsamplevalue
				</ax21:newvalue>
			</source>
			<target
				xmlns:ax21="http://services.samples/xsd"
				xmlns:ns="http://services.samples" action="sibling" xpath="//ns:getQuoteResponse/ns:return/ax21:volume"/>
			</enrich>
			<cache collector="true"/>
			<respond/>
		</inSequence>
</resource>
</api>

Samples

/wiki/spaces/EI6xx/pages/49611291

Invalidating cached responses remotely

You can invalidate all cached response remotely by using any JMX monitoring tool such as Jconsole via the exposed MBeans. You can use the invalidateTheWholeCache()operation of the org.wso2.carbon.mediatio n MBean for this as shown below.

com.atlassian.confluence.content.render.xhtml.migration.exceptions.UnknownMacroMigrationException: The macro 'next_previous_links2' is unknown.