我制作了一个基于GnuPdf创建PDF文件的java程序。它在使用本机java代码(在Windows或iSeries QSH上)运行时运行良好,但是,当通过RPGLE接口运行时,程序在处理图像时崩溃(在似乎是随机间隔)。我将其中一个跟踪到从.jar文件加载图像并从代码中删除了调用。它工作了一段时间,但现在崩溃从IFS加载的图像。也许RPGLE以某种方式锁定文件和想法?代码是从服务程序中调用的。
这是stacktrace
java.lang.NullPointerException
at gnu.jpdf.PDFImage.write(PDFImage.java:286)
at gnu.jpdf.PDFOutput.write(PDFOutput.java:114)
at gnu.jpdf.PDFDocument.write(PDFDocument.java:307)
at gnu.jpdf.PDFJob.end(PDFJob.java:182)
at com.mysite.pdf.PdfDocumentStateValid.endDocument(PdfDocumentStateValid.java:657)
at com.mysite.pdf.PdfDocument.endDocument(PdfDocument.java:36)
java.io.IOException: Descriptor not valid.
at java.lang.Throwable.<init>(Throwable.java:196)
at java.lang.Exception.<init>(Exception.java:41)
at java.io.IOException.<init>(IOException.java:40)
at java.io.FileOutputStream.writeBytes(Native Method)
at java.io.FileOutputStream.write(FileOutputStream.java:260)
at java.io.ByteArrayOutputStream.writeTo(ByteArrayOutputStream.java:112)
at gnu.jpdf.PDFOutput.<init>(PDFOutput.java:96)
at gnu.jpdf.PDFDocument.write(PDFDocument.java:302)
at gnu.jpdf.PDFJob.end(PDFJob.java:182)
at java.awt.PrintJob.finalize(PrintJob.java:60)
at java.lang.ref.Finalizer.runFinalizer(Finalizer.java:116)
at java.lang.ref.Finalizer.access$100(Finalizer.java:47)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:193)
答案 0 :(得分:0)
现在改变我的答案,我可以看到堆栈跟踪。当您点击本机代码时会出现问题(本机意味着您基本上钻取了操作系统级别或操作系统自定义代码)。
你得到的描述符的IOException无效(并且我假设它意味着文件描述符(即FileDescriptor)。现在在QShell中运行它并从RPG运行它的最大区别在于Java代码从RPG调用可能是在不同的ID和/或权限级别调用的。您可能必须修改iSeries到您的程序,以授予它Java权限,以便让正确的权限执行它所需的操作。(我知道你会认为这是Java中的SecurityManager已经发现的东西......但我知道当你在自定义操作系统(i5 / OS)上使用自定义JVM(读取IBM)时,有时可能会出现奇怪的事情。你会受到怜悯供应商(在这种情况下是IBM)。给那个镜头(权限的东西),看看是否能解决你的问题。
另外......我用谷歌搜索,发现这与iSeries有关:https://www-304.ibm.com/support/docview.wss?uid=nas379538999e744aad1862575b0006e28ab 因此,操作系统使用的jt400库可能存在缺陷,您可能需要PTF它和/或您的JVM。只是另一种想法尝试的想法。