[ 
https://issues.apache.org/jira/browse/WW-4147?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Jasper Rosenberg updated WW-4147:
---------------------------------

    Description: 
Currently, the first request to the web app triggers getting the Freemarker 
Configuration, which causes it to be built for the first time.  

Depending on circumstances, this might be a bit slow.  It would be nice if when 
struts was coming up, it forced Freemarker initialization before it the server 
was declared ready to accept requests.

The way I hacked around this was to extend StrutsPrepareAndExecuteFilter so 
that in init(FilterConfig), I get the current FreemarkerManager, and call 
.getConfiguration(filterConfig.getServletContext()) on it.

As an aside, it was surprisingly difficult to get the Container to use to 
inject the FreemarkerManager instance in StrutsPrepareAndExecuteFilter.  I'm 
guessing I'm just missing something.

I recognize not all struts apps are using freemarker, which is probably why it 
inits lazily, but it would be great to have an easy hook, and 
StrutsPrepareAndExecuteFilter is the obvious place since you have access to the 
ServletContext.


{code:java}
    private FreemarkerManager freemarkerManager;

    /**
     * Override to initialize freemarker hooks proactively.
     */
    @Override
    public void init(final FilterConfig filterConfig) throws ServletException {
        super.init(filterConfig);

        // Inject the freemarker manager
        prepare.assignDispatcherToThread();
        try {
            Dispatcher.getInstance().getContainer().inject(this);
        } finally {
            Dispatcher.setInstance(null);
        }
        
        // Force initialization of the freemarker configuration
        freemarkerManager.getConfiguration(filterConfig.getServletContext());
    }

    @Inject
    public void setFreemarkerManager(FreemarkerManager freemarkerManager) {
        this.freemarkerManager = freemarkerManager;
    }
{code}

  was:
Currently, the first request to the web app triggers getting the Freemarker 
Configuration, which causes it to be built for the first time.  

Depending on circumstances, this might be a bit slow.  It would be nice if when 
struts was coming up, it forced Freemarker initialization before it the server 
was declared ready to accept requests.

The way I hacked around this was to extend StrutsPrepareAndExecuteFilter so 
that in init(FilterConfig), I get the current FreemarkerManager, and call 
.getConfiguration(filterConfig.getServletContext()) on it.

As an aside, it was surprisingly difficult to get the Container to use to 
inject the FreemarkerManager instance in StrutsPrepareAndExecuteFilter.  I'm 
guessing I'm just missing something.

I recognize not all struts apps are using freemarker, which is probably why it 
inits lazily, but it would be great to have an easy hook, and 
StrutsPrepareAndExecuteFilter is the obvious place since you have access to the 
ServletContext.

{code:java}
    private FreemarkerManager freemarkerManager;

    /**
     * Override to initialize freemarker hooks proactively.
     */
    @Override
    public void init(final FilterConfig filterConfig) throws ServletException {
        super.init(filterConfig);

        // Inject the freemarker manager
        prepare.assignDispatcherToThread();
        try {
            Dispatcher.getInstance().getContainer().inject(this);
        } finally {
            Dispatcher.setInstance(null);
        }
        
        // Force initialization of the freemarker configuration
        freemarkerManager.getConfiguration(filterConfig.getServletContext());
    }

    @Inject
    public void setFreemarkerManager(FreemarkerManager freemarkerManager) {
        this.freemarkerManager = freemarkerManager;
    }
{code}

    
> Have StrutsPrepareAndExecuteFilter initialize Freemarker rather than first 
> actual Request
> -----------------------------------------------------------------------------------------
>
>                 Key: WW-4147
>                 URL: https://issues.apache.org/jira/browse/WW-4147
>             Project: Struts 2
>          Issue Type: Improvement
>          Components: Other
>    Affects Versions: 2.3.15.1
>            Reporter: Jasper Rosenberg
>            Priority: Minor
>              Labels: freemarker, performance, startup
>
> Currently, the first request to the web app triggers getting the Freemarker 
> Configuration, which causes it to be built for the first time.  
> Depending on circumstances, this might be a bit slow.  It would be nice if 
> when struts was coming up, it forced Freemarker initialization before it the 
> server was declared ready to accept requests.
> The way I hacked around this was to extend StrutsPrepareAndExecuteFilter so 
> that in init(FilterConfig), I get the current FreemarkerManager, and call 
> .getConfiguration(filterConfig.getServletContext()) on it.
> As an aside, it was surprisingly difficult to get the Container to use to 
> inject the FreemarkerManager instance in StrutsPrepareAndExecuteFilter.  I'm 
> guessing I'm just missing something.
> I recognize not all struts apps are using freemarker, which is probably why 
> it inits lazily, but it would be great to have an easy hook, and 
> StrutsPrepareAndExecuteFilter is the obvious place since you have access to 
> the ServletContext.
> {code:java}
>     private FreemarkerManager freemarkerManager;
>     /**
>      * Override to initialize freemarker hooks proactively.
>      */
>     @Override
>     public void init(final FilterConfig filterConfig) throws ServletException 
> {
>         super.init(filterConfig);
>         // Inject the freemarker manager
>         prepare.assignDispatcherToThread();
>         try {
>             Dispatcher.getInstance().getContainer().inject(this);
>         } finally {
>             Dispatcher.setInstance(null);
>         }
>         
>         // Force initialization of the freemarker configuration
>         freemarkerManager.getConfiguration(filterConfig.getServletContext());
>     }
>     @Inject
>     public void setFreemarkerManager(FreemarkerManager freemarkerManager) {
>         this.freemarkerManager = freemarkerManager;
>     }
> {code}

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to