Re: In 2.3.19, sharing cache storage

Jaime Garza <[email protected]> Wed, 23 Jul 2014 11:48:28 -0700 (PDT)
Newsgroups gmane.comp.web.freemarker.devel
Message-ID <e17e6277-bbda-456b-92fe-0224c1c4664a@default>
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:[email protected]] 
Sent: Wednesday, July 23, 2014 11:22 AM
To: Jaime Garza
Cc: [email protected]
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


------------------------------------------------------------------------------
Want fast and easy access to all the code in your enterprise? Index and
search up to 200,000 lines of code with a free copy of Black Duck
Code Sight - the same software that powers the world's largest code
search on Ohloh, the Black Duck Open Hub! Try it now.
http://p.sf.net/sfu/bds