gpt4 book ai didi

java - 使用Struts2 + Freemarker生成大文件

转载 作者:行者123 更新时间:2023-11-28 22:11:19 24 4
gpt4 key购买 nike

我需要使用 Struts2Freemarker 将数据转储到一个大的 xml(50 ~ 500 Mb)中:

<?xml version="1.0" encoding="UTF-8"?>
<documents>
<#list collection as document>
<document>
...
</document>
<#if document_index % 100 == 0>
<#flush/>
</#if>
</#list>
</document>

由于 collection 可能很大,它已经实现了一个内部逻辑来获取部分数据,使用它并在有可用数据时再次获取。

问题似乎与 XML 的缓冲区有关:应用程序偶尔会崩溃(java.lang.OutOfMemoryError)。

根据 documentation,每 100 个文档调用一次 Freemarker flush 但我不知道是否实际发生了刷新仅表示嵌入软件(Strut2 + Tomcat7)。

关于如何强制冲洗有什么建议吗?

JVM 处理大约 1~2 Gb 的堆内存,也许只是内存的问题?

也许 org.apache.struts2.views.freemarker.FreemarkerManager 可以为此目的适当调整?

最佳答案

我找到了解决方案。

问题出在Struts2 FreemarkerResult以及此类如何让您处理输出写入器的刷新。

基本上,如果您使用 TemplateExceptionHandler.RETHROW_HANDLER 作为异常处理程序(就像我所做的那样),整个模板将在 执行任何刷新之前处理。 (这是期望的行为,因为如果有任何模板错误,您希望在将任何输出发送到响应之前抛出异常并在更高级别处理)

但是 TemplateExceptionHandler 是嵌入在 FreemarkerManager 中的固定配置,不能根据给定请求的需要进行切换。

我决定扩展 FreemarkerResult 重写方法 doExecute(...) 以包含强制标准 flushing-during-template-process 对于单个请求,即使全局配置是 TemplateExceptionHandler.RETHROW_HANDLER

关于java - 使用Struts2 + Freemarker生成大文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42504866/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com