Java 在服务器日志中获取FreeMarker异常,即使Struts2 f/w用于web应用程序

Java 在服务器日志中获取FreeMarker异常,即使Struts2 f/w用于web应用程序,java,struts2,freemarker,socketexception,Java,Struts2,Freemarker,Socketexception,我面临着一个神秘的问题,它对我的web应用程序的可用性造成了严重破坏。一些背景- 服务器-Apache+Tomcat7 Web框架-带JSP的Struts2 在晚些时候检查服务器日志时,我遇到了很多以下异常情况- 26092219 [http-bio-8080-exec-695] ERROR org.apache.struts2.components.template.FreemarkerTemplateEngine - Could not load the FreeMarker temp

我面临着一个神秘的问题,它对我的web应用程序的可用性造成了严重破坏。一些背景-

  • 服务器-Apache+Tomcat7
  • Web框架-带JSP的Struts2
在晚些时候检查服务器日志时,我遇到了很多以下异常情况-

26092219 [http-bio-8080-exec-695] ERROR org.apache.struts2.components.template.FreemarkerTemplateEngine  - Could not load the FreeMarker template named 'hidden':
26092219 [http-bio-8080-exec-695] ERROR org.apache.struts2.components.template.FreemarkerTemplateEngine  - Attempted: /template/simple/hidden.ftl
26092219 [http-bio-8080-exec-695] ERROR org.apache.struts2.components.template.FreemarkerTemplateEngine  - The TemplateLoader provided by the FreeMarker Configuration was a: freemarker.cache.MultiTemplateLoader

Error reading included file template/simple/dynamic-attributes.ftl
The problematic instruction:

----------
==> include "/${parameters.templateDir}/simple/dynamic-attributes.ftl" [on line 44, column 1 in template/simple/a-close.ftl]
----------

Java backtrace for programmers:
----------
freemarker.template.TemplateException: Error reading included file template/simple/dynamic-attributes.ftl
freemarker.template.TemplateException: Error reading included file template/simple/dynamic-attributes.ftl
    at freemarker.core.Include.accept(Include.java:167)
    at freemarker.core.Environment.visit(Environment.java:209)
    at freemarker.core.MixedContent.accept(MixedContent.java:92)
    at freemarker.core.Environment.visit(Environment.java:209)
    at freemarker.core.Environment.process(Environment.java:189)
    at freemarker.template.Template.process(Template.java:237)
    at org.apache.struts2.components.template.FreemarkerTemplateEngine.renderTemplate(FreemarkerTemplateEngine.java:157)
    at org.apache.struts2.components.UIBean.mergeTemplate(UIBean.java:559)
    at org.apache.struts2.components.Anchor.end(Anchor.java:145)
    at org.apache.struts2.views.jsp.ComponentTagSupport.doEndTag(ComponentTagSupport.java:42)
    at org.apache.jsp.jsp_005froot.ajax.synset.trackedCustomEntities_jsp._jspx_meth_gs_005fa_005f0(trackedCustomEntities_jsp.java:648)
    at org.apache.jsp.jsp_005froot.ajax.synset.trackedCustomEntities_jsp._jspx_meth_gs_005fif_005f2(trackedCustomEntities_jsp.java:573)
    at org.apache.jsp.jsp_005froot.ajax.synset.trackedCustomEntities_jsp._jspx_meth_gs_005fiterator_005f0(trackedCustomEntities_jsp.java:380)
    at org.apache.jsp.jsp_005froot.ajax.synset.trackedCustomEntities_jsp._jspService(trackedCustomEntities_jsp.java:128)
...
这种情况持续发生,然后导致-
打开的文件太多
异常,就像这样

java.io.FileNotFoundException: /opt/tomcat7/work/Catalina/localhost/_/loader/template/simple/form.ftl (Too many open files)
javax.mail.MessagingException: Could not connect to SMTP host: localhost, port: 25;
  nested exception is:
java.net.SocketException: Too many open files
    ...
我之所以感到困惑,主要是因为代码库中没有一个freemarker文件。我猜这是在我导入的某个库中发生的,麻烦的是我有大量的库,所以仔细检查每一个库,找出哪一个在运行是不可行的

临时工。我的方法是重新启动服务器&将“ulimit-n”的大小增加一倍。但这只是绷带。我想找到这个问题的根源&通过删除有问题的库或包含丢失的库来解决它

谢谢你的帮助

更新
我在几个小时内收集的stacktraces转储—希望这能提供一些指针。

TemplateException
异常的原因是什么?这不也是“打开的文件太多”吗?因为问题可能是有时候模板从模板缓存中掉出来,然后突然有很多线程(即访问者)需要它,所以它会被并行地打开和解析,直到它再次进入缓存。这会耗尽最大文件句柄吗?没有丢失的库;S2使用FreeMarker作为其自定义标记。至于为什么会这样,不确定,以前从未见过。您是在应用程序中使用自定义主题执行某些操作,还是在服务静态文件,还是…?@ddekany我认为是某些原因导致出现了太多打开的文件&我猜这是由于此文件未找到异常造成的。@DaveNewton我确实在服务静态文件。但我不知道自定义主题。事实上,我继承了代码库,所以我不知道它的所有细节,所以我自己也不知所措。你说的是静态文件,我应该如何调试它?
FileNotFoundException
-s在操作系统没有文件句柄时发生,如果我理解得很好,而不是相反。再次强调,查看该
TemplateException
的原因异常可能会有所帮助,因为这可能也是由于打开的文件太多而导致的
FileNotFoundException
。该
TemplateException
的原因异常是什么?这不也是“打开的文件太多”吗?因为问题可能是有时候模板从模板缓存中掉出来,然后突然有很多线程(即访问者)需要它,所以它会被并行地打开和解析,直到它再次进入缓存。这会耗尽最大文件句柄吗?没有丢失的库;S2使用FreeMarker作为其自定义标记。至于为什么会这样,不确定,以前从未见过。您是在应用程序中使用自定义主题执行某些操作,还是在服务静态文件,还是…?@ddekany我认为是某些原因导致出现了太多打开的文件&我猜这是由于此文件未找到异常造成的。@DaveNewton我确实在服务静态文件。但我不知道自定义主题。事实上,我继承了代码库,所以我不知道它的所有细节,所以我自己也不知所措。你说的是静态文件,我应该如何调试它?
FileNotFoundException
-s在操作系统没有文件句柄时发生,如果我理解得很好,而不是相反。同样,查看该
TemplateException
的原因异常可能会有所帮助,因为这可能也是由于打开的文件太多而导致的
FileNotFoundException