cocoon-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Alexander Klimetschek <alexander.klimetsc...@mindquarry.com>
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 =
             BlockCallStack.getCurrentBlockContext();

         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 ;-)

Alex

[1] http://marc.theaimsgroup.com/?l=xml-cocoon-dev&m=116957460020578&w=2

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
http://www.mindquarry.com


Mime
View raw message