我们有一个运行在Tomcat / Ubuntu上的Web应用程序,并使用iText7.1.8生成pdf文档(发票)。我们注意到我们的Tomcat崩溃了很多次,然后在调查发现问题出在iText之后。这是个例外
SEVERE: Socket accept failed
org.apache.tomcat.jni.Error: 24: Too many open files
at org.apache.tomcat.jni.Socket.accept(Native Method)
at org.apache.tomcat.util.net.AprEndpoint$Acceptor.run(AprEndpoint.java:992)
at java.lang.Thread.run(Thread.java:745)
当我们运行以下命令时: sudo ls -l / proc / Tomcat-PID / fd ,我们注意到打开的大多数文件都带有扩展名 .pfm (例如:/usr/share/fonts/type1/gsfonts/n022004l.pfm),并且从未发布过。这个数量会不断增加,直到达到打开的文件最大数量。
这是用于生成pdf的Java代码。
public static File convertToPDF(File pdfFile,URL webURL){
InputStream htmlStream=null;
FileOutputStream pdfStream=null;
try {
htmlStream=webURL.openStream();
pdfStream=new FileOutputStream(pdfFile);
ConverterProperties properties = new ConverterProperties();
properties.setFontProvider(new DefaultFontProvider(true, true, true));
HtmlConverter.convertToPdf(htmlStream, pdfStream,properties);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
if(htmlStream!= null){
htmlStream.close();
}
if(pdfStream!= null){
pdfStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return pdfFile;
}
我们应该使用单例来避免生成PDF并打开多个文件的多实例吗?
环境:
谢谢
答案 0 :(得分:0)
已解决的问题。 使用单例获取转换器属性:
private static ConverterProperties properties;
private static DefaultFontProvider defaultFontProvider;
...
defaultFontProvider= new DefaultFontProvider(true, true, true);
properties.setFontProvider(defaultFontProvider);