struts-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Lorenzo Bernacchioni (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (WW-4749) Buffer/Flush behaviour in FreemarkerResult
Date Wed, 26 Apr 2017 09:33:04 GMT

    [ https://issues.apache.org/jira/browse/WW-4749?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15984444#comment-15984444
] 

Lorenzo Bernacchioni commented on WW-4749:
------------------------------------------

two marginal notes:

* parameter {{writeIfCompleted}} is no longer used and could be removed
* for sake of readability I would leave {{useBufferedWriter}} as a {{Boolean}}  and eventually
if a {{String}} input is more compliant parse the String in the setter method

{code}
	public void setUseBufferedWriter(String useBufferedWriter) {
		this.useBufferedWriter = Boolean.parseBoolean(useBufferedWriter);
	}
{code}

> Buffer/Flush behaviour in FreemarkerResult
> ------------------------------------------
>
>                 Key: WW-4749
>                 URL: https://issues.apache.org/jira/browse/WW-4749
>             Project: Struts 2
>          Issue Type: Improvement
>          Components: Core Results
>    Affects Versions: 2.3.31, 2.5.1
>            Reporter: Lorenzo Bernacchioni
>            Assignee: Lukasz Lenart
>            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 request
> {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)

Mime
View raw message