jbuda said the following on 10/14/2010 06:01 AM:
<cache aliases="full-navigation" strategyName="full_navigation" id="navigation">
    <notify listener="SiteMapListener" method="fullNavigation" 
returnArg="navigation" />
</cache>
I think the issue is that you're assuming that the cache key generated by Mach-II is "navigation" and this isn't the case. Actually, because of the complexity of offering caching in controller layer and in the XML, the keys are computed.

Cache handlers without the "id" attribute use a generated number so if you need to access them you at least need to set an "id". Also this the cache key can have other data mixed into it when you start using the criteria attribute.

If you turn on Mach-II logging, you can see the keys being used -- you shouldn't base this off the logging output, but I'm mentioning it so you can see what's going on. Here's a snippet:

MachII.framework.CacheHandler

        

debug

        

Created cache with key 'HANDLERID=263D72D55687C48BBF4428CAECA5E6D2'.

        

0

MachII.framework.CacheHandler

        

debug

        

Cached data contained key names of 'count,layout.subNavTabs,layout.content'.

        

1

MachII.framework.CacheHandler

        

trace

        

Cached 10 HTML head elements.

        

0

MachII.framework.CacheHandler

        

trace

        

Cached 0 HTML body elements.

        

1

MachII.framework.CacheHandler

        

trace

        

Cached 0 HTTP headers.

        

0


<cfdump
var="#getAppManager().getCacheManager().getCacheStrategyManager().getCacheStrategyByName("full_navigation").get("navigation")#">
At this point, you need the cache key to pass to the caching strategy, but you only have the cache handler id. Anything cached from a <cache> handler use a key format of this:

HANDLERID={cacheHandlerId}&PRODUCTID={valueOfProductId}

The HANDLERID is the "id" of the <cache> handler or if there is no "id" then it's auto-generated. It is followed by any criteria you have defined in the <cache> in uppercase and sorted alphnum ASC.

So in this case you example should work using a key because you are not using any criteria:

<cfdump var="#getAppManager().getCacheManager().getCacheStrategyManager().getCacheStrategyByName("full_navigation").get("HANDLERID=navigation")#">

The issue you will run into is "what if the requested key isn't defined?" This is taken care for you in the XML because the required commands are nested in the <cache> handler, but when you are accessing that data outside of XML syntax -- the data could not be in the cache yet. I'd say for situations where you want to take advantage of using cached data from the cache API like you want to -- I'd just do it manually in your listener. That way you can handle when you don't have cached data:

<cfset var data = getAppManager().getCacheManager().getCacheStrategyManager().getCacheStrategyByName("full_navigation").get("navigation") />

<!--- If nothing is in the cache, then data won't be available because the strategy returns NULL --->
<cfif NOT IsDefined("data")>
    .... run code to get the data ...
<cfset data = getSomeService().someMethod() />
<cfset getAppManager().getCacheManager().getCacheStrategyManager().getCacheStrategyByName("full_navigation").put("navigation", data) />
</cfif>

<cfreturn data />

HTH,
.Peter

--
You received this message because you are subscribed to Mach-II for CFML list.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/mach-ii-for-coldfusion?hl=en

***New URLs as of April 29th, 2010***
SVN: http://svn.mach-ii.com/machii/
Wiki / Documentation / Tickets: http://trac.mach-ii.com/machii/

Reply via email to