1

我们使用 Apache FOP 将大量 XML 转换为 AFP 和 PDF。我们当前的负载将是在 HP-UX 系统上每次运行大约 25k 个文件。我们总共有 8 个线程,用于以生产者-消费者的方式初始化和触发 FOP 转换。最近在转换过程中出现了多次失败,在查找时,我们收到了一般的 FOP 错误,例如:

**ERROR,2460364,FOToPDF_Thread_11,FOP Exception, something.pdf,Failed to resolve font with embed-url './Fonts/arial.ttf'** 

或者它的错误未能加载字体度量文件,尽管文件是完整的并具有正确的权限。生成了许多其他 PDF,因此这不是问题。

我们还结束了:

**java.io.FileNotFoundException: /PDF/20130111130002/something.pdf (Too many open files (errno:24))**

从正在处理的日志和卷来看,这看起来像是一个 FOP 问题。我读过 FOP 过去曾在字体文件中遇到过这个问题。在某些情况下,Apache 多次打开每个字体文件但未关闭句柄,从而导致大量打开的文件。这应该是固定的,但如果它仍然存在,除了将它发布在 Apache 列表上之外,还有什么好的快速解决方案呢?

可以将每个进程的打开文件描述符的 HP-UX 最大文件数限制增加到 2048 以上吗?那会有帮助吗?还有其他建议吗?

4

2 回答 2

2

我已经检查了 FOP 源代码。有一个名为 FontFileReader 的类,用于读取真字体。该类有两个构造函数,如下所示:

/**
 * Constructor
 *
 * @param fileName filename to read
 * @throws IOException In case of an I/O problem
 */

public FontFileReader(String fileName) throws IOException {
    final File f = new File(fileName);
    InputStream in = new java.io.FileInputStream(f);
    try {
        init(in);
    } finally {
        in.close();
    }
}

/**
* Constructor
*
* @param in InputStream to read from
* @throws IOException In case of an I/O problem
*/
public FontFileReader(InputStream in) throws IOException {
    init(in);
}

正如您在上面的第二个构造函数中看到的那样,输入流没有关闭,但在上面的构造函数中它是显式关闭的。

还有另一个名为 TTFFontLoader 的类将 ttf 字体加载到内存中,该类使用第二个构造函数(突出显示)来读取字体文件,所以我认为这就是为什么流保持打开状态并且必须达到打开的进程范围限制文件句柄并给出“打开的文件太多”错误。

自从在当前主干版本的 FOP 代码中重构 FOP 字体子系统后,此问题已得到解决。

于 2013-01-28T11:33:53.340 回答
1

Apache FOP 项目的相关问题是

https://issues.apache.org/jira/browse/FOP-2189

正如我在那里评论的那样,我无法在 FOP 1.0 中识别任何打开的文件句柄。接受 InputStream 参数的 FontFileReader 的构造函数确实没有关闭它,但是调用者(创建流的)正在关闭它,参见第 94-106 行

http://svn.apache.org/repos/asf/xmlgraphics/fop/tags/fop-1_0/src/java/org/apache/fop/fonts/truetype/TTFFontLoader.java

于 2013-02-27T21:00:46.803 回答