[
https://issues.apache.org/jira/browse/WW-4749?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Lorenzo Bernacchioni updated WW-4749:
-------------------------------------
Description:
Scenario: the application use freemarker with a
{{TemplateExceptionHandler.RETHROW_HANDLER}} policy, but occasionally needs to
produce large XML (20~200Mb) and goes out of memory.
In
[FreemarkerResult|http://grepcode.com/file/repo1.maven.org/maven2/org.apache.struts/struts2-core/2.5-BETA1/org/apache/struts2/views/freemarker/FreemarkerResult.java#191]
there are two possible behaviours (line 191):
* *Buffer-behaviour*: the whole template is processed and if everything is OK
it is flushed to the output, otherwise an exception is thrown and handled at
higher level before any output has been sent. This is intended to be used when
{{TemplateExceptionHandler.RETHROW_HANDLER}} is active
* *Flush-behaviour*: template is processed and flushed according to freemarker
library policies, used with any other {{TemplateExceptionHandler}}
Since {{TemplateExceptionHandler}} cannot be switched for a given request (it
is a global configuration embedded in {{FreemarkerManager}}) there is no way to
force a Flush-behaviour. (you can only force a Buffer-behaviour using
{{isWriteIfCompleted}}
I implemented a more flexible solution that let you force the behaviour in both
ways:
{code:title=FreemarkerResult.java|borderStyle=solid}
final boolean willUsebufferedWriter;
if (useBufferedWriter != null){
willUsebufferedWriter = useBufferedWriter;
}else{
willUsebufferedWriter = configuration.getTemplateExceptionHandler() ==
TemplateExceptionHandler.RETHROW_HANDLER;
}
if (willUsebufferedWriter){
...
}else{
...
}
{code}
where {{useBufferedWriter}} is a parameter that can be modified per resquest
{code}
<result type="freemarker">
<param name="location">big_feed.ftl</param>
<param name="contentType">text/xml</param>
<param name="useBufferedWriter">false</param>
</result>
{code}
was:
Scenario: the application use freemarker with a
{{TemplateExceptionHandler.RETHROW_HANDLER}} policy, but occasionally needs to
produce large XML (20~200Mb) and goes out of memory.
In
[FreemarkerResult|http://grepcode.com/file/repo1.maven.org/maven2/org.apache.struts/struts2-core/2.5-BETA1/org/apache/struts2/views/freemarker/FreemarkerResult.java#191]
there are two possible behaviours (line 191):
* *Buffer-behaviour*: the whole template is processed and if everything is OK
it is flushed to the output, otherwise an exception is thrown and handled at
higher level before any output has been sent. This is intended to be used when
{{TemplateExceptionHandler.RETHROW_HANDLER}} is active
* *Flush-behaviour*: template is processed and flushed according to freemarker
library policies, used with any other {{TemplateExceptionHandler}}
Since {{TemplateExceptionHandler}} cannot be switched for a given request (it
is a global configuration embedded in {{FreemarkerManager}}) there is no way to
force a Flush-behaviour. (you can only force a Buffer-behaviour using
{{(isWriteIfCompleted}})
I implemented a more flexible solution that let you force the behaviour in both
ways:
{code:title=FreemarkerResult.java|borderStyle=solid}
final boolean willUsebufferedWriter;
if (useBufferedWriter != null){
willUsebufferedWriter = useBufferedWriter;
}else{
willUsebufferedWriter = configuration.getTemplateExceptionHandler() ==
TemplateExceptionHandler.RETHROW_HANDLER;
}
if (willUsebufferedWriter){
...
}else{
...
}
{code}
where {{useBufferedWriter}} is a parameter that can be modified per resquest
{code}
<result type="freemarker">
<param name="location">big_feed.ftl</param>
<param name="contentType">text/xml</param>
<param name="useBufferedWriter">false</param>
</result>
{code}
> Buffer/Flush behaviour in FreemarkerResult
> ------------------------------------------
>
> Key: WW-4749
> URL: https://issues.apache.org/jira/browse/WW-4749
> Project: Struts 2
> Issue Type: Bug
> Components: Core Results
> Reporter: Lorenzo Bernacchioni
> Priority: Minor
> Fix For: 2.5.next
>
>
> Scenario: the application use freemarker with a
> {{TemplateExceptionHandler.RETHROW_HANDLER}} policy, but occasionally needs
> to produce large XML (20~200Mb) and goes out of memory.
> In
> [FreemarkerResult|http://grepcode.com/file/repo1.maven.org/maven2/org.apache.struts/struts2-core/2.5-BETA1/org/apache/struts2/views/freemarker/FreemarkerResult.java#191]
> there are two possible behaviours (line 191):
> * *Buffer-behaviour*: the whole template is processed and if everything is
> OK it is flushed to the output, otherwise an exception is thrown and handled
> at higher level before any output has been sent. This is intended to be used
> when {{TemplateExceptionHandler.RETHROW_HANDLER}} is active
> * *Flush-behaviour*: template is processed and flushed according to
> freemarker library policies, used with any other {{TemplateExceptionHandler}}
> Since {{TemplateExceptionHandler}} cannot be switched for a given request (it
> is a global configuration embedded in {{FreemarkerManager}}) there is no way
> to force a Flush-behaviour. (you can only force a Buffer-behaviour using
> {{isWriteIfCompleted}}
> I implemented a more flexible solution that let you force the behaviour in
> both ways:
> {code:title=FreemarkerResult.java|borderStyle=solid}
> final boolean willUsebufferedWriter;
> if (useBufferedWriter != null){
> willUsebufferedWriter = useBufferedWriter;
> }else{
> willUsebufferedWriter = configuration.getTemplateExceptionHandler()
> == TemplateExceptionHandler.RETHROW_HANDLER;
> }
>
> if (willUsebufferedWriter){
> ...
> }else{
> ...
> }
> {code}
> where {{useBufferedWriter}} is a parameter that can be modified per resquest
> {code}
> <result type="freemarker">
> <param name="location">big_feed.ftl</param>
> <param name="contentType">text/xml</param>
> <param name="useBufferedWriter">false</param>
> </result>
> {code}
--
This message was sent by Atlassian JIRA
(v6.3.15#6346)