0

我正在使用 iTextPDF 5.4.2 版,并且在负载很重时遇到线程争用问题。我正在使用 IBM JDK 6

这就是问题所在,当有多个独立线程试图生成不同的 pdf 文件时,我在 SecureRandom.nextBytes 上看到了争用,因为这是同步的,所有线程都在等待锁定该对象。下面是线程转储

*"WebContainer : 0" daemon prio=3 tid=0x007ffc00 nid=0x91 waiting for monitor entry [0xc823d000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at java.security.SecureRandom.nextBytes(SecureRandom.java:433)
    - waiting to lock <0xdf4b7430> (a java.security.SecureRandom)
    at java.util.UUID.randomUUID(UUID.java:162)
    at com.itextpdf.text.pdf.PdfPCell.<init>(PdfPCell.java:123)
    at com.itextpdf.text.pdf.PdfPRow.<init>(PdfPRow.java:136)
    at com.itextpdf.text.pdf.PdfPTable.<init>(PdfPTable.java:260)
    at com.itextpdf.text.pdf.PdfPCell.<init>(PdfPCell.java:251)
    at com.itextpdf.text.pdf.PdfPRow.<init>(PdfPRow.java:136)
    at com.itextpdf.text.pdf.PdfPTable.<init>(PdfPTable.java:260)
    at com.itextpdf.text.pdf.PdfPCell.<init>(PdfPCell.java:251)
    at com.itextpdf.text.pdf.PdfPRow.<init>(PdfPRow.java:136)
    at com.itextpdf.text.pdf.PdfPTable.<init>(PdfPTable.java:260)
    at com.itextpdf.text.pdf.PdfPCell.<init>(PdfPCell.java:251)
    at com.itextpdf.text.pdf.PdfPRow.<init>(PdfPRow.java:136)
    at com.itextpdf.text.pdf.PdfPTable.adjustCellsInRow(PdfPTable.java:1377)
    at com.itextpdf.text.pdf.PdfPTable.getRows(PdfPTable.java:1364)
    at com.itextpdf.text.pdf.ColumnText.goComposite(ColumnText.java:1702)
    at com.itextpdf.text.pdf.ColumnText.go(ColumnText.java:881)
    at com.itextpdf.text.pdf.ColumnText.go(ColumnText.java:876)
    at com.itextpdf.text.pdf.ColumnText.go(ColumnText.java:865)
    at com.itextpdf.text.pdf.PdfDocument.addPTable(PdfDocument.java:2566)
    at com.itextpdf.text.pdf.PdfDocument.add(PdfDocument.java:723)
    at com.itextpdf.text.Document.add(Document.java:278)* 

你能帮忙避免这个问题吗?

席德

4

1 回答 1

1

我希望争用不是锁,而是随机字节。我很难确切地说出您正在使用什么设置,但我怀疑SecureRandom该类使用了操作系统提供的(缓慢的)安全随机服务,并且您正在耗尽熵池。当它用尽时,读取随机数据的调用将阻塞,直到有更多数据可用。尝试获取随机数据的其他线程将卡在锁上,看起来锁是问题所在。

我认为解决此问题的最简单方法是升级到最新版本的 iTextPdf。在此版本中,ID 已从 UUID 更改为从不阻塞的计数器生成的整数。

如果您无法升级,另一个潜在的解决方法是更改​​环境中使用的安全提供程序,以提供安全性较低但速度更快的SecureRandom服务。

于 2014-12-11T16:14:53.683 回答