Uploaded image for project: 'Struts 2'
  1. Struts 2
  2. WW-4749

Buffer/Flush behaviour in FreemarkerResult

    Details

    • Type: Improvement
    • Status: Closed
    • Priority: Minor
    • Resolution: Fixed
    • Affects Version/s: 2.3.31, 2.5.1
    • Fix Version/s: 2.5.12
    • Component/s: Core Results
    • Labels:
      None

      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 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:

      FreemarkerResult.java
          final boolean willUsebufferedWriter;
          if (useBufferedWriter != null){
              willUsebufferedWriter = useBufferedWriter;
          }else{
              willUsebufferedWriter = configuration.getTemplateExceptionHandler() == TemplateExceptionHandler.RETHROW_HANDLER;
          }
                      
          if (willUsebufferedWriter){
          ...
          }else{
          ...
          }       
      

      where useBufferedWriter is a parameter that can be modified per request

      <result type="freemarker">
          <param name="location">big_feed.ftl</param>
          <param name="contentType">text/xml</param>
          <param name="useBufferedWriter">false</param>
      </result>
      

        Attachments

          Issue Links

            Activity

              People

              • Assignee:
                lukaszlenart Lukasz Lenart
                Reporter:
                fustaki Lorenzo Bernacchioni
              • Votes:
                0 Vote for this issue
                Watchers:
                6 Start watching this issue

                Dates

                • Created:
                  Updated:
                  Resolved: