Tomcat7 IText在Ubuntu中保持pfm文件打开

Tomcat7 IText在Ubuntu中保持pfm文件打开,tomcat7,Tomcat7,我们有一个运行在Tomcat/Ubuntu上的web应用程序,它使用iText7.1.8生成pdf文档(发票)。我们注意到我们的Tomcat崩溃了很多次,然后经过调查发现问题就在它旁边。这是个例外 SEVERE: Socket accept failed org.apache.tomcat.jni.Error: 24: Too many open files at org.apache.tomcat.jni.Socket.accept(Native Method)

我们有一个运行在Tomcat/Ubuntu上的web应用程序,它使用iText7.1.8生成pdf文档(发票)。我们注意到我们的Tomcat崩溃了很多次,然后经过调查发现问题就在它旁边。这是个例外

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和打开多个文件的过程的多实例

环境:

  • Ubuntu 14.04
  • Tomcat 7.0.52
  • Java 1.7.0_80-b15
  • itext 7.1.8
谢谢你

修复了这个问题。 使用单例获取转换器属性:

private static ConverterProperties properties; 
private static DefaultFontProvider defaultFontProvider;
...
defaultFontProvider= new DefaultFontProvider(true, true, true);
properties.setFontProvider(defaultFontProvider);