WAS v8.5 > Reference > Configuration file descriptions

cachespec.xml file


Overview

DynaCache parses cachespec.xml when the server starts, and extracts a set of configuration parameters from each cache-entry element. Every time a new servlet or other cacheable object initializes, the cache attempts to match each of the cache-entry elements to find the configuration information for that object.

The cache-entry elements can be inside the root cache element or inside a cache-instance element. Cache entries that are in the root element are cached with the default cache instance. Cache entries that are in the <cache-instance> element are cached in that particular cache instance. Different cacheable objects have different class elements. We can define the specific object that a cache policy refers to using the name element.


Location

Place the cachespec.xml file with the deployment module. We can also place a global cachespec.xml file in the application server properties directory. If a global cachespec.xml exists, and a cachespec.xml file also exists in an application, the entries in the two cachespec.xml files are merged. If there are conflicting entries in the two files, the entries in the application cachespec.xml override entries in the global cachespec.xml.

The cachespec.dtd file in the application server properties directory defines the legal structure and available elements.


Usage notes

Cachespec.xml elements

The root element of the cachespec.xml file is cache and contains cache-instance and cache-entry elements. The cache-entry elements can also be placed inside of cache-instance elements to make that cache entry part of a cache instance that is different from the default.

cache-instance

<cache-instance name="cache_instance_name"></cache-instance>

The name attribute is the JNDI name of the cache instance set in the dmgr console.

Contains at least one cache-entry element that is matched to the servlet cache instance specified by the name attribute. If identical cache-entry elements exist across cache-instance elements, the first cache-entry element that is matched is used.

cache-entry

Specifies information used by DynaCache to process the entry. Cache entry elements in cachespec.xml file include...

With the current version of WebSphere Application Server, we can define multiple cache policies for a single servlet. For example, if you define multiple mappings for a servlet in web.xml, we can create a cache entry for each one of the mappings.

class

<class>command | servlet | webservice | JAXRPCClient | static | portlet </class>

This element is required and specifies how the application server interprets the remaining cache policy definition. The value servlet refers to servlets and JSP files deployed in the WAS servlet engine. The webservice class extends the servlet with special component types for web services requests. The JAXRPCClient is used to define a cache entry for the web services client cache. The value, command, refers to classes using the WAS command programming model. The value, static, refers to files containing static content. The following examples illustrate the class element:

<class>command</class> <class>servlet</class> <class>webservice</class> <class>JAXRPCClient</class> <class>static</class> <class>portlet</class>

name

<name>name</name>

For commands, this required element must include the package name, if any, and class name, including a trailing .\class, of the configured object.

If we specify command caching in the cachespec.xml file, and servlet caching is not enabled for the application server on which the application runs, you will get an error. The application server still attempts to obtain a cache instance; therefore, enabling servlet caching will eliminate the error.

For servlets and JSP files, if the cachespec.xml file is in the WAS properties directory, this required element must include the full URI of the JSP file or servlet to cache. For servlets and JSP files, if the cachespec.xml file is in the web application, this required element can be relative to the specific web application context root.

For web services, include the URI of the SOAP router associated with the web service to cache.

For web services client cache, the name is the target end point of the cacheable web service or the URI of the SOAP router associated with the cacheable web service. We can use the SOAP address location in the WSDL file to define the name for the web services client cache.

For static files, if the cachespec.xml file is in the WAS properties directory, this required element must include the full URI of the file to cache. If the cachespecm.xml file is in the web application, this required element can be relative to the specific web application context root. For a web application with a context root, the cache policy for files using the static class must be specified in the web application, and not in the properties directory.

For portlets, if the cachespec.xml file is in the WAS properties directory, this required element must include the full context path and name of the portlet to cache. If the cachespec.xml file is in the web application, this required element is the portlet name that is relative to the specific web application context root.

The preferred location of the cachespec.xml file is in the web application, not the properties directory.

We can specify multiple name elements within a cache-entry if we have different mappings that refer to the same servlet.

The following examples illustrate the name element:

<name>com.mycompany.MyCommand.class</name> <name>default_host:/servlet/snoop</name> <name>com.mycompany.beans.MyJavaBean</name>  
<name>mywebapp/myjsp.jsp</name> <name>/soap/servlet/soaprouter</name> <name>http://remotecompany.com:9080/service/getquote</name> <name>mywebapp/myLogo.gif</name>

sharing-policy

<sharing-policy> not-shared | shared-push | shared-pull | shared-push-pull</sharing-policy>

When working within a cluster with a distributed cache, these values determine the sharing characteristics of entries created from this object. If this element is not present, a not-shared value is assumed. In single server environments, not-shared is the only valid value. When enabling a replication, the default value is not-shared . This property does not affect distribution to Edge Side Include processors through the Edge fragment caching property.

Sharing-policy values. Values and description for the sharing-policy.

Value Description
not-shared Cache entries for this object are not shared among different application servers. These entries can contain non-serializable data. For example, a cached servlet can place non-serializable objects into the request attributes, if the <class> type supports it.

The application server will always replicate invalidation entries. They are not affected by the sharing policy.

shared-push Cache entries for this object are automatically distributed to the dynamic caches in other application servers or cooperating JVMs. Each cache has a copy of the entry at the time it is created. These entries cannot store non-serializable data.
shared-pull Cache entries for this object are shared between application servers on demand. If an application server gets a cache miss for this object, it queries the cooperating application servers to see if they have the object. If no application server has a cached copy of the object, the original application server runs the request and generates the object. These entries cannot store non-serializable data. This mode of sharing is not recommended.
shared-push-pull Cache entries for this object are shared between application servers on demand. When an application server generates a cache entry, it broadcasts the cache ID of the created entry to all cooperating application servers. Each server then knows whether an entry exists for any given cache ID. On a given request for that entry, the application server knows whether to generate the entry or pull it from somewhere else. These entries cannot store non-serializable data.

The following example shows a sharing policy:

<sharing-policy>not-shared</sharing-policy> 

skip-cache

Takes the name of a request attribute, which if present in the request context, dictates the response cannot be retrieved from the cache instance specified. This property is useful for previewing content in production systems and verifying the application is working and performing as expected.
<cache>     <!-- Applies only to the base cache -->     <skip-cache-attribute>att1</skip-cache-attribute> 
    ...

    < cache-instance name="instance1">         <!-- Applies only to this instance -->         <skip-cache-attribute>att2</skip-cache-attribute> 
        ...
    </cache-instance> </cache> 

property

<property name="key">value</property>

where key is the name of the property for this cache entry element, and value is the corresponding value.

We can set optional properties on a cacheable object, such as a description of the configured servlet. The class determines valid properties of the cache entry. At this time, the following properties are defined:

Property values. Property values and valid classes.

Property Valid classes Value
ApplicationName All Overrides the JavaEEName application ID so that multiple applications can share a common cache ID namespace.
EdgeCacheable Servlet True or false. The default is false. If the property is true, then the given servlet or JSP file is externally requested from an Edge Side Include processor. Whether or not the servlet or JSP file is cacheable depends on the rest of the cache specification.

The permissible components for general edgecacheable cache entries are PARAMETER, HEADER, COOKIE, and PATH_INFOSERVLET_PATH

ExternalCache Servlet and portlet External cache name. The external cache name needs to match the external cache group name.
consume-subfragments Servlet, web service, or portlet True or false. The default is false. When a servlet is cached, only the content of that servlet is stored, and includes placeholders for any other fragments to which it includes or forwards. Consume-subfragments (CSF) tells the cache not to stop saving content when it includes a child servlet. The parent entry, the one marked CSF, includes all the content from all fragments in its cache entry, resulting in one big cache entry that has no includes or forwards, but the content from the whole tree of entries. Consume-subfragments can save a significant amount of application server processing, but is typically only useful when the external HTTP request contains all the information needed to determine the entire tree of included fragments.

Use the <exclude> element to tell the cache to stop consuming for the excluded fragment and instead, create a placeholder for the include or forward. For example, exclude A.jsp from the consume-subfragment, as follows:

<property name="consume-sbufragments">true
<exclude>/A.jsp<exclude> </property> 
do-not-consume Servlet, web service, or portlet True or false. The default is false. When a fragment parent has the consume-subfragment property set to true the child fragment content is saved in the cache entry of the parent. Do-not-consume (DNC) tells the cache to stop saving the content for this fragment in the parent cache-entry and create a placeholder instead for the include or forward.
alternate_url Servlet Specifies the alternate URL used to invoke the servlet or JSP file. The property is valid only if the EdgeCacheable property also is set for the cache entry.
persist-to-disk All True or false. The default is true. When false, the cache entry is not written to the disk when overflow or server stopping occurs.
save-attributes Servlet and portlet True or false. The default is true. When false, the request attributes are not saved with the cache entry.

Use the <exclude> element to specify the request attributes that do not apply to the save-attributes property. For example, to save only the attr1 attribute with the cache entry:

<property name=
  "save-attributes">false
<exclude>attr1</exclude> </property> 

To save all attributes except the attr1 attribute in the cache entry, set the property to true in the preceding sample. If we do not use the <exclude> element, either all or no request attributes are saved with the cache entry.

delay-invalidations Command True or false. When true, the commands that are invalidating cached objects based on the invalidation rules in this cache entry invalidate the cache entries after running. By default, the invalidation occurs before the command runs.
store-cookies Servlet and portlet On or off. The default is On. This property takes one or more cookie name as its argument which is saved along with the cache object and restored by the servlet cache in the response with a set-cookie header.

Save all cookies except cookie1 as part of the cache-entry as follows:

<property name="store-cookies">true
<exclude>cookie</exclude> </property> 

Save only cookie1 as part of the cache-entry, as follows:

<property name="store-cookies">false
<exclude><cookie1</exclude> </property> 
ignore-get-post Servlet and portlet True or false. The default is false. When the property is set to true the request type is not appended to the cache-id for GET and POST requests unless the requestType component requestType component subelement is defined. By default the request type is automatically appended to the cache-id for GET and POST requests.
ignore-char-encoding Servlet and portlet True or false. Default is false. When the property is set to true, UTF-8 character encoding is not appended to the cache ID. Appending UTF-8 character encoding to the cache ID might lead to multiple copies of fragments, which unnecessarily increases the size of the cache.
do-not-cache Servlet and portlet Defines a fragment that is neither cached nor consumed by its parent.

<cache-entry> ...
<property name="do-not-cache">true</property> 
or
<cache-id> <property name="do-not-cache">true</property> </cache-id> </cache-entry> 

cache-id

To cache an object, the application server must know how to generate a unique ID for different invocations of that object. These IDs are built either from user-written custom Java code or from rules that are defined in the cache policy of each cache entry. Each cache entry can have multiple cache ID rules that run in order until either:

  • A rule returns a non-empty cache ID, or
  • No more rules are left to run.

If none of the cache ID generation rules produce a valid cache ID, the object is not cached.

Each cache-id element defines a rule for caching an object and is composed of the sub-elements component, timeout, inactivity, priority, property, idgenerator, and metadatagenerator. The following example illustrates a cache-id element:

<cache-id>    component*| timeout? | inactivity? | priority? | property* | idgenerator? | metadatagenerator?
</cache-id> 

component subelement

Use the component subelement to generate a portion of the cache ID. The component subelement consists of the attributes id, type, and ignore-value, and the elements index, method, field, required, value, and not-value.

  • Use the id attribute to identify the component.

  • Use the type attribute to identify the type of component. The following table lists the values for the type.

    When the parameter component subelement is specified in the cachespec.xml file, the web container sets character encoding based on the encoding setting obtained from the request object. If a servlet subsequently invokes the setCharacterEncoding method, the method has not effect because character encoding cannot be changed after it has already been set.

    Type values. Type valid classes and meaning.

    Type Valid classes Meaning
    method Command Calls the indicated method on the command or object
    field Command Retrieve the named field in the command or object
    parameter Servlet and portlet Retrieve the named parameter value from the request object
    parameter-list Servlet and portlet Retrieves a list of values for the named parameter

    The cache grabs the values for all of the parameters with this name and uses all of these values, in the order they are grabbed, to create the cache ID gotcha

    session Servlet and portlet Retrieve the named value from the HTTP session
    cookie Servlet Retrieve the named cookie value
    attribute Servlet and portlet Retrieve the named request attribute
    header Servlet, web service, and portlet Retrieve the named request header
    pathInfo Servlet Retrieve the pathInfo element from the request
    servletpath Servlet Retrieve the servlet path
    locale Servlet and portlet Retrieve the request locale

    The locale component is permissible for edgecacheable entries only, when using RRD. The locale component is not valid for all other ESI versions.

    requestType Servlet and portlet Retrieve the HTTP request method from the request.

    The requestType component is permissible for edgecacheable entries only, when using RRD. The requestType component is not valid for all other ESI versions.

    tiles_attribute Servlet and portlet Retrieve the value of an attribute from a tile.
    SOAPEnvelope Web service and web services client cache Retrieve the SOAPEnvelope element from a web services request. An ID attribute of Hash uses a Hash of the SOAPEnvelope element, while Literal uses the SOAPEnvelope element as received.
    SOAPAction Web service Retrieve the SOAPAction header, if available, for a web services request.
    serviceOperation Web service Retrieve the service operation for a web services request
    serviceOperationParameter Web service Retrieve the specified parameter from a web services request
    operation Web services client cache Indicates an operation type in the WSDL file. The id attribute is ignored and the value is the operation or method name. If the namespace of the operation is specified, format the value as namespaceOfOperation:nameOfOperation.
    part Web services client cache Indicates an input message part in the WSDL file or a request parameter. Its id attribute is the part or parameter name, and the value is the part or parameter value.
    SOAPHeaderEntry Web services client cache Retrieves special information in the SOAP header of the web services request. The id attribute specifies the name of the entry. In addition, the entry of the SOAP header in the SOAP request must have the actor attribute, which contains com.ibm.websphere.cache. For example:
    <soapenv:Header>  <getQuote soapenv:actor="com.ibm.websphere.cache">IBM</getQuote> </soapenv:Header> 
    portletSession Portlet Retrieve the named value from the portlet session
    portletWindowId Portlet Retrieve the portlet window ID from the portlet request object
    portletMode Portlet Retrieve the portlet mode from the portlet request object
    portletWindowsState Portlet Retrieve the portlet window state from the portlet request object
    sessionID Servlet and portlet Retrieve the HTTP session ID

  • Use the ignore-value attribute to specify whether or not to use the value that is returned by this component in cache ID formation. This attribute is optional with a default value of false. If the value is true, only the ID of the component is used when creating a cache ID, or no output is used when creating a dependency or invalidation ID.

  • Use the method element to call a void method on a returned object. We can infinitely nest method and field objects in any combination. The method must be public and is not valid for edge-cacheable components. For example:
    <component id="getUser" type="method"><method>getUserInfo
    <method>getName</method></method></component> 

    This method is equivalent to getUser().getUserInfo().getName()

    For component types attribute, method, or field that can return an object, when the object returned is a collection or array, the ID is created with a comma separated list of the elements in the collection or array. For example, if the request attribute users returns an array [a, b] and the cache entry is defined like the following example:

    <cache-entry>  <class>servlet</class>  <name>xxx.jsp</name>  <cache-id>   .
      .
      <componentattribute">    <required>true</required>   </component>   .
      .
     </cache-id>  <dependency-id>dep
      <componentattribute">    <required>true</required>   </component>  </dependency-id> </cache-entry> 
    The cache id contains the string users: a,b. The dependency id is dep: a,b.

    Use the multipleIDs attribute with the component types to specify and generate multiple dependency IDs (or invalidation IDs), based on the items in the collection or array. For example:

    <cache-entry>  <class>servlet</class>  <name>xxx.jsp</name>  <cache-id>   .
      .
       <componentattribute">     <required>true</required>    </component>   .
      .
     </cache-id>  <dependency-id>dep
      <componentattribute" multipleIDs="true">    <required>true</required>   </component>  </dependency-id> </cache-entry> 
    The cache policy will generates the following dependency IDs:

    • dep:a,b
    • dep:a
    • dep:b

    Use the index element with the previous component type to add only the value of the element at the specified index position in the collection or array, to the ID that is being created.

    <cache-entry>  <class>servlet</class>  <name>xxx.jsp</name>  <cache-id>   .
      .
       <componentattribute">     <required>true</required>     <index>1</index>    </component>   .
      .
     </cache-id>  <dependency-id>dep
      <componentattribute" multipleIDs="true">    <required>true</required>   </component>  </dependency-id> </cache-entry> 
    The previous cache policy generates the following component to use in the cache ID: users: b. Use the <method> element to call a void method on a returned object.

  • Use the field element to access a field in a returned object. We can infinitely nest method and field objects in any combination. The field must be public. This field is not valid for edge-cacheable components. For example:
    <component id="getUser" type="method"><method>getUserInfo
    <field>name</field></method></component> 

    This method is equivalent to the getUser().getUserInfo().name method.

  • Use the required element to specify whether or not this component must return a non-null value for this cache ID to represent a valid cache. If set to true, this component must return a non-null value for this cache ID to represent a valid cache ID. If set to false, the default, a non-null value is used in the formation of the cache ID and a null value means that this component is not used at all in the ID formation. For example:
    <required>true</required> 

  • Use the value element to specify values that must match to use this component in cache ID formation. For example:
    <component id="getUser" type="method"><value>blue</value> 
    <value>red</value> </component> 

  • Use the not-value element to specify values that must not match to use this component in cache ID formation. This method is similar to value element, but instead prescribes the defined values from caching. We can use multiple not-value elements when more than one value not valid exists. For example:
    <component id="getUser" type="method"> <required>true</required> <not-value>blue</not-value> <not-value>red</not-value></component> 

The component subelement can have either a method and a field element, a value element, or a not-value element. The method and field elements apply to commands only. The following example illustrates the attributes of a component sub-element:

<component id="isValid" type="method" ignore-value="true"><component> 

timeout subelement

The timeout subelement is used to specify an absolute time-to-live (TTL) value for the cache entry. For example,
<timeout>value</timeout> 

where value is the amount of time, in seconds, to keep the cache entry. Cache entries that are in memory are kept indefinitely, as long as the entries remain in memory. Cache entries stored on disk are evicted if they are not accessed for 24 hours.

inactivity subelement

The inactivity subelement is used to specify a time-to-live (TTL) value for the cache entry based on the last time the cache entry was accessed. It is a subelement of the cache-id element.
<inactivity>value</inactivity> 
where value is the amount of time, in seconds, to keep the cache entry in the cache after the last cache hit.

priority subelement

Use the priority subelement to specify the priority of a cache entry in a cache. The priority weighting is used by the least recently used (LRU) algorithm of the cache to decide which entries to remove from the cache if the cache runs out of storage space. For example,
<priority>value</priority> 

where value is a positive integer between 1 and 16 inclusive.

Samples

The following sample keeps the cache entry in the cache for a minimum of 35 seconds and a maximum of 180 seconds. If the cache entry is accessed within each 35 second inactivity period, the inactivity period is extended for another 35 seconds. However, because the timeout element is also configured, the cache entry is always invalidated after 180 seconds. If the cache entry is not accessed within the 35 second period, the entry is removed from the cache.
<cache-id>  <component id="timeout" type="parameter">   <required>true</required>  </component>  <timeout>180</timeout>  <inactivity>35</inactivity>  <priority>1</priority> </cache-id> 

The following sample keeps the cache entry in the cache for a minimum of 600 seconds. If the cache entry is accessed within each 600 second period, the inactivity period is extended for another 600 seconds. If the cache entry is not accessed within the 600 second period, the cache entry is removed from the cache.
<cache-id>  <component id="timeout" type="parameter">   <required>true</required>  </component>  <inactivity>600</inactivity>  <priority>1</priority> </cache-id> 

In the following sample, the value for inactivity has no meaning because the timeout period is less than the inactivity period. The cache entry is always invalidated after 180 seconds, no matter how often the cache entry is accessed.
<cache-id>  <component id="timeout" type="parameter">   <required>true</required>  </component>  <timeout>180</timeout>  <inactivity>600</inactivity>  <priority>1</priority> </cache-id> 

property subelement

Specify generic properties for the cache entry. For example,
    <property name="key">value</property> 

where key is the name of the property to define, and value is the corresponding value.

For example:


<property name="description">The Snoop Servlet</property> 

Property subelement values.. Property valid classes and meaning.

Property Valid classes Meaning
sharing-policy/timeout/priority All Overrides the settings for the containing cache entry when the request matches this cache ID.
EdgeCacheable Servlet Overrides the settings for the containing cache entry when the request matches this cache ID.


idgenerator and metadatagenerator sub-elements

Use the idgenerator element to specify the class name that is loaded for the generation of the cache ID. The IdGenerator element must implement the com.ibm.websphere.servlet.cache.IdGenerator interface for a servlet or the com.ibm.websphere.webservices.IdGenerator interface for the web services client cache. An example of the idgenerator element follows:

<idgenerator> class name </idgenerator> 
Where class name is the fully-qualified name of the class to use. Define this generator class in a shared library.

Use the metadatagenerator element inside the cache-id element to specify the class name loaded for the metadata generation. The MetadataGenerator class must implement the com.ibm.websphere.servlet.cache.MetaDataGenerator interface for a servlet or the com.ibm.websphere.cache.webservices.MetaDataGenerator interface for a web services client cache. The MetadataGenerator class defines properties like timeout, inactivity, external caching properties or dependencies. An example of the metadatagenerator element follows:

<metadatagenerator> classname </metadatagenerator> 
In this example, class name is the fully-qualified name of the class to use. Define this generator class in a shared library.


dependency-id element

Use the dependency-id element to specify additional cache identifiers that associate multiple cache entries to the same group identifier.

The value of the dependency-id element is generated by concatenating the dependency ID base string with the values that are returned by its component elements. If a required component returns a null value, the entire dependency does not generate and is not used. Validate the dependency IDs explicitly through the dynamic cache API, or use the invalidation element. Multiple dependency ID rules can exist in one cache-entry element. All dependency rules run separately.


invalidation element

To invalidate cached objects, the application server must generate unique invalidation IDs. Build invalidation IDs by writing custom Java code or through rules that are defined in the cache policy of each cache entry. The following example illustrates an invalidation in the cache policy:

<invalidation>component* | invalidationgenerator? </invalidation> 


invalidationgenerator subelement

The invalidationgenerator element is used with the web services client cache only. Use the invalidationgenerator element to specify the class name to load for generating invalidation IDs. The InvalidationGenerator class must implement the com.ibm.websphere.cache.webservices.InvalidationGenerator interface. An example of the invalidationgenerator element follows:

<invalidationgenerator>class name</invalidationgenerator> 
In this example, classname is the fully qualified name of the class that implements the com.ibm.websphere.cache.webservices.InvalidationGenerator interface. Define this generator class in a shared library.


Related


Assemble applications


Reference:

Example: Configuring the dynamic cache service


+

Search Tips   |   Advanced Search