Concerns and issues relating to all versions of WebSphere Application Server
This week I ran into a situation where an internal customer wanted to do the following-
1. Cache a JSP/Servlet ONLY when a particular request attribute or parameter was absent and some other parameters were present. This is tricky because there is no explicit support in the cachespec.xml rules to do this. The best way to cache a page on the absence of a parameter is like so ....
<cache-id>
<component id="vehicles" type="parameter">
<value>-1</value>
<required>false</required>
</component>
<component id="category" type="parameter">
<required>true</required>
</component>
<timeout>0</timeout>
</cache-id>
In this case we will only cache the servlet IF the value of the vehicles parameter is -1. If at runtime the value of the vehicles parameter is never -1 then this has the desired effect of never caching when the vehicles parameter is present on the request. To understand this read the infocenter on the required and value component sub-elements
-
required 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.
-
value Use the value element to specify values that must match to use this component in cache ID formation.
2. Cache a JSP based on the value of a session attribute's method or field Let me provide a few examples of how we managed to do this
<!-- This will cause will cause reqattrtest servlet to get cached with the following cache id
/com.ibm.ws.cache.servlet.reqattrtest.class:customer=14:requestType=GET cacheid is evaluated as request.getSession().getAttribute("customer").getUserName().length() -->
<cache-entry>
<class>servlet</class>
<name>com.ibm.ws.cache.servlet.reqattrtest.class</name>
<cache-id>
<component id="customer" type="session">
<method>getUserName<method>length</method></method>
<required>true</required>
</component>
<timeout>0</timeout>
<priority>1</priority>
</cache-id>
</cache-entry>
<!-- This will cause /purchase.jsp to get cached if the "itemInfo" attribute is present on the request and has a non null value for the field min i..e use ( (ItemInfo)request.getAttribute("itemInfo")).min to create the cache-id.
<cache-entry>
<class>servlet</class>
<name>/purchase.jsp</name>
<property name="consume-subfragments">false</property>
<property name="do-not-consume">true</property>
<cache-id>
<component id="category" type="parameter">
<required>true</required>
</component>
<component id="itemInfo" type="attribute">
<field>min</field>
<required>true</required>
</component>
<timeout>0</timeout>
</cache-id>
</cache-entry>
The examples below demonstrate HOW to cache servlets based on arbitrary methods & fields of objects in session or request attributes or parameters. These can be useful for applying caching in complex usescases by dropping the cachespec,xml in a pre-existing application where there isn't much room for change to make the application cachespec.xml friendly. Labels: cachespec.xml
Post a Comment
Note: Only a member of this blog may post a comment.