cocoon-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Alexander Klimetschek <>
Subject Re: Keys for cache are insufficient when using multiple block servlets
Date Thu, 25 Jan 2007 19:20:06 GMT
I just wrote a pipeline that fixes my other problem [1] (by selecting 
between two different pipelines based on the actual running mode) and 
included this fix for the caching key which works fine. I have to pass 
through each of the ProcessingPipeline methods anyway and in each call 
that has the Environment as parameter I change the uri prefix set in it:

private void fixEnvironmentForCachingPrefix(Environment env) {
     if (this.fixMissingCachingPrefixWithBlockServlets &&
         (env.getURIPrefix() == null || env.getURIPrefix().equals(""))) {

         ServletContext context =

         if (context instanceof BlockContext) {
             // use the mount path of the block as the prefix
             String mountPath =
                 ((BlockContext) context).getMountPath() + "/";
             env.setURI(mountPath, env.getURI());

The trick is using the static method 
BlockCallStack.getCurrentBlockContext() and using the mount path as a 
unique and short URI prefix, which is then used by the caching pipeline 
implemenations. You are free to consider it as a dirty hack ;-)



Vadim Gritsenko schrieb:
> Daniel Fagerstrom wrote:
>> Alexander Klimetschek skrev:
>>> Hi,
>>> when using multiple block-servlets in one cocoon application (2.2), 
>>> they will all use the same EHDefaultStore as cache. If there are 
>>> similar matchers in the sitemaps, eg. images/header.png, the key for 
>>> the cached resource will be the same for both blocks (just 
>>> images/header.png), and, as the cache is global, the same cached 
>>> object will be returned for both requests. This happens with 
>>> expires-caching.
>>> This should be fixed by adding a unique key prefix for each 
>>> block-servlet or by one cache per block-servlet, but I do not know 
>>> how to configure this.
>> The Spring bean name for the block-servlet would work fine as an 
>> unique bean prefix.
> Prefix from parent sitemap used to be part of the key, IIRC. Works even 
> better.
>> And it is available from ServletConfig.getServletName() in the 
>> block-servlet. The next and more complicated question is how to get 
>> the identifier to the caching key ...
> .... or how to fix the regression.
> Vadim

Alexander Klimetschek

View raw message