2 Replies Latest reply on Mar 5, 2007 6:09 PM by antoine_h

    invalidate cache / user per user and window per window

    antoine_h

      Hello,

      I want to invalidate the cache of one window (ie instance of portlet).
      This done independently for each user.

      this invalidation (reset of cache) would be triggered by another portlet (or a JMX service).

      so that a Portlet A still have some cache, but sometime, because of a general event in the portal, it gets refreshed. The event may come from portlet B or C.

      first main use : for a menu or navigation bar,
      second main use : for two portlets working together... (loose coupled, but sometime need to refresh for coherence).

      any clue for this ?
      thanks,


        • 1. Re: invalidate cache / user per user and window per window

          Hello Antoine,

          it cannot really be done right now as cached content is stored in the HTTP session of the user (which makes sense since it has the same lifecycle than the user).

          The code is located in org.jboss.portal.portlet.aspect.cache.ConsumerCacheInterceptor. Here the content of the cache is retrieved/stored in the PRINCIPAL_SCOPE context.

          This context is the (http session + the principal id) : the http session for the lifecycle management and the principal id for security reasons (so a user does not see the cached content from another user which can happens on logout operations when the session cookie stays the same).

          So basically you can modify this interceptor to store instead the content in a shared cache and have that shared cache expose operation through JMX. This interceptor is declared in jboss-portal.sar/META-INF/jboss-service.xml and at this place you can replace the default implementation by your.

          For the cache you could use JBoss Cache has a field of your interceptor and expose invalidation methods on the interceptor itself as it is already an MBean.

          • 2. Re: invalidate cache / user per user and window per window
            antoine_h

            Hello,

            I have done it without using the jboss cache.
            I use only a "signal", that is a parameter in the underlying HttpServletRequest.
            I wonder if it is a proper way. (clean, surely not, but working ok ?).

            If anyone can confirm it is ok ?
            if so, I'll write a wiki about this, with the helper class and test portlets I made for this feature.

            In the process action of the portlet that want to invalidate the cache of all portlet, I set a render parameter.

            resp.setRenderParameter(CACHE_SIGNAL_RENDER_PARAM_NAME,
             CACHE_SIGNAL_RENDER_PARAM_VALUE);
            


            In the ConsumerCacheInterceptor :
            - I get the invocation.getContext() and try to cast this context to an AbstractInvocationContext
            - if this cast is ok, I get the HttpServletRequest client request from it
            HttpServletRequest httpServletRequest = abstractInvCtxt.getClientRequest();
            

            - from this HttpServletRequest, I get the parameter
            httpServletRequest.getParameter(CACHE_SIGNAL_RENDER_PARAM_NAME);


            If the value of the parameter says to invalidate the cache, I do so.

            The parameter is seen in the ConsumerCacheInterceptor for all the windows/portlet of the page... which is great for this feature, but seems strange.
            The parameter was set for only one portlet, in its processAction method...

            I have made some detailed tests, and it works fine.

            anybody can confirm this is ok ? Julien ?
            Thanks.