gpt4 book ai didi

java - Docker 容器阻塞中的 Apache Batik 转码器

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:02:02 33 4
gpt4 key购买 nike

我们正在 docker 容器中运行 Spring 应用程序。我们的应用程序可以获取 SVG 文件并将它们转换为 PDF 格式以嵌入到 PDF 中。

该应用程序可在 osx 上正常运行并按预期进行转码。然而,当从具有不同文件系统的 docker 容器内部运行时,转码器会卡住并在一些奇怪的递归文件搜索循环中使 cpu 崩溃。

java.lang.Thread.State: RUNNABLE
at java.io.UnixFileSystem.getBooleanAttributes0(Native Method)
at java.io.UnixFileSystem.getBooleanAttributes(UnixFileSystem.java:242)
at java.io.File.isFile(File.java:882)
at org.apache.commons.io.filefilter.FileFileFilter.accept(FileFileFilter.java:59)
at org.apache.commons.io.filefilter.AndFileFilter.accept(AndFileFilter.java:122)
at org.apache.commons.io.filefilter.AndFileFilter.accept(AndFileFilter.java:122)
at org.apache.commons.io.filefilter.OrFileFilter.accept(OrFileFilter.java:118)
at java.io.File.listFiles(File.java:1291)
at org.apache.commons.io.DirectoryWalker.walk(DirectoryWalker.java:357)
at org.apache.commons.io.DirectoryWalker.walk(DirectoryWalker.java:364)
at org.apache.commons.io.DirectoryWalker.walk(DirectoryWalker.java:364)
at org.apache.commons.io.DirectoryWalker.walk(DirectoryWalker.java:364)
at org.apache.commons.io.DirectoryWalker.walk(DirectoryWalker.java:364)
at org.apache.commons.io.DirectoryWalker.walk(DirectoryWalker.java:364)
at org.apache.commons.io.DirectoryWalker.walk(DirectoryWalker.java:364)
at org.apache.commons.io.DirectoryWalker.walk(DirectoryWalker.java:364)
at org.apache.commons.io.DirectoryWalker.walk(DirectoryWalker.java:364)
at org.apache.commons.io.DirectoryWalker.walk(DirectoryWalker.java:364)
at org.apache.commons.io.DirectoryWalker.walk(DirectoryWalker.java:364)
at org.apache.commons.io.DirectoryWalker.walk(DirectoryWalker.java:364

下面是运行 PDFTranscoder 的线程的堆栈跟踪。 Walk 被递归调用了一段时间,然后最终调用了 getBooleanAttributes0 并且一切都阻塞了。

经过进一步研究,我们发现我们可以更仔细地了解 strace 发生了什么。命令并看到系统本质上是在无限循环中发送以下垃圾邮件。

stat("/./sys/devices/pci0000:00/PNP0103:00/subsystem/devices/PNP0103:00/subsystem/devices/PNP0103:00/subsystem/devices/PNP0103:00/subsystem/devices/PNP0103:00/subsystem/devices/PNP0103:00/subsystem/devices/PNP0103:00/subsystem/devices/PNP0103:00/subsystem/devices/PNP0103:00/subsystem/devices/PNP0103:00/subsystem/devices/PNP0103:00/subsystem/devices/PNP0103:00/subsystem/devices/PNP0103:00/subsystem/devices/PNP0103:00/subsystem/devices/PNP0103:00/subsystem/devices/PNP0103:00/subsystem/devices/PNP0103:00/subsystem/devices/PNP0103:00/subsystem/devices/pcspkr/input/input1/subsystem/input0/subsystem/input0/uniq", {st_mode=S_IFREG|0444, st_size=4096, ...}) = 0 <0.000224>

我们似乎在统计调用中被阻塞或挂起。但是我们现在已经对系统调用进行了如此深入的研究,以至于很难调试。有人有什么想法吗?

最佳答案

我遇到了同样的错误。在尝试了很多方法来修复它之后,我得出的结论是您在 Mac OS X 上可以使用字体,而您的( headless )Docker 容器操作系统没有字体。在到处搜索字体时,转码器并没有优雅地失败。我通过强制转码器解决它 use the default fonts (并且不自动寻找其他字体)像这样:

...
PDFTranscoder transcoder = new PDFTranscoder();
transcoder.addTranscodingHint(PDFTranscoder.KEY_AUTO_FONTS, false);
...
transcoder.transcode(transcoderInput, transcoderOutput);
...

请注意,当它遇到 14 种字体之外的一种时,当然会回退到其已知字体的缺点。我尝试了一些方法来解决这个问题,但到目前为止还没有成功。

我希望这对某人有帮助。

关于java - Docker 容器阻塞中的 Apache Batik 转码器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47664735/

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