Re: [Freemarker-devel] In 2.3.19, sharing cache storage
Generates text that depends on changing data (like dynamic HTML).
Brought to you by:
revusky
From: Jaime G. <jai...@or...> - 2014-07-23 18:48:38
|
Oh, using a shared configuration would be acceptable? That is great to hear. That is what I have now, but I thought that would be an anti-pattern. I will continue with that. The modifications that I have done have to do with adaptations to FM to make it more of a DSL. We use FM for formatting emails and SMS messages. I have modified mostly FMParser.jj keeping a series of svn patch files for each one of my modifications, hopefully helping me move to a more recent FM. We have extensions for sql queries with a <#data> directive, data phrasing as a builtin for sequences, ?unique for sequences, etc. We maintain our own FM document based on the 2.3.19 docs. We needed some validation support, multiple error messages per template (one error was not acceptable,) and others. Thanks Jaime -----Original Message----- From: Daniel Dekany [mailto:dd...@fr...] Sent: Wednesday, July 23, 2014 11:22 AM To: Jaime Garza Cc: fre...@li... Subject: Re: [Freemarker-devel] In 2.3.19, sharing cache storage The problem with the approach is that Template-s are bound to a Configuration instance (they store a reference to it), and sometimes may reach back to it during template execution. However, can't you just use a common Configuration instance on all those places that share templates? (Out of curiosity... what's the modification in 2.3.19 is about?) -- Thanks, Daniel Dekany Wednesday, July 23, 2014, 5:51:52 PM, Jaime Garza wrote: > Hi Daniel, > > I am trying to share an instance of MruCacheStorage across threads. > I keep it around across multiple threads and when creating my > Configuration, I simply do a Configuration#setCacheStorage(). This > internally calls Configuration#createTemplateCache, which calls > cache.setConfiguration(this), which calls TemplateCache#clear(), which > eventually clears the storage. > > My use case is that I know that a set of around 200 threads will be > accessing the same templates over and over (executing the same > template(s) on a different root namespace) concurrently. I want the > loading of templates to happen as infrequently as possible. Also, > since I am on a slightly customized version of 2.3.19, I cannot come to the greatest new version. > > The question (or questions) is: is there a way to implement my > strategy? My current workaround is nasty. I have created a subclass of > MruCacheStorage, which reads a flag "canClear" from thread local, and > then decides whether to let the clear proceed or not. I sandwitched > the call to setCacheStorage() with canClear = false and canClear = > true > > SharedCacheSettings.disallowClear(); > config.setCacheStorage(storage); > SharedCacheSettings.allowClear(); > > AND > > public class SharedCacheStorage extends MruCacheStorage { > public SharedCacheStorage(int maxStrongSize, int maxSoftSize) { > super(maxStrongSize, maxSoftSize); > } > > @Override > public void clear() { > if (!SharedCacheSettings.canClear()) > return; > > super.clear(); > } > } > > What is your opinion about my hack? What kind of trouble am I inviting? > > Thanks in advance. > Jaime Garza |