Java 程序卡在 XMLWorkerHelper.getInstance().parseXHtml

问题描述 投票:0回答:0

我现在在生产中有时会遇到这种问题。对于上下文,我使用 RabbitMQ 和一个名为 email-service 的 Consumer,RabbitMQ 是我的消息传递服务器,而 email-service 负责将 HTML 字符串转换为 PDF 并通过电子邮件发送。我正在使用这种方法

XMLWorkerHelper.getInstance().parseXHtml()
将 HTML 解析为 PDF,有时它会在日志上没有错误地卡住,这使得我的rabbitMQ UNACK 当前排队的所有消息。请看下面的代码:

                ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
                log.info( "END OF ByteArrayOutputStream" );
                Document document = new Document();
                log.info( "END OF Document" );
                PdfWriter writer = PdfWriter.getInstance(document, outputStream);
                log.info( "END OF PdfWriter" );
                document.open();
                log.info( "END OF document.open();" );
                XMLWorkerHelper.getInstance().parseXHtml(writer, document, 
                         new StringReader(fileAttachmentString)); // <--- sometimes stuck here
                log.info( "END OF XMLWorkerHelper" );
                document.close();
                log.info( "END OF document.close();" );
                byte[] bytes = outputStream.toByteArray();
                log.info( "END OF byte[] bytes = outputStream.toByteArray();" );
                DataSource dataSource = new ByteArrayDataSource(bytes, "application/pdf");
                log.info( "END OF DataSource" );
                attachmentPart.setDataHandler(new DataHandler(dataSource));
                attachmentPart.setFileName(filename);
                multipart.addBodyPart(attachmentPart);

如果发生这种情况,我需要再次重新启动电子邮件服务,以便它将再次使用 RabbitMQ 中的消息。我不知道是什么原因导致它卡在那里一段时间。

注意:重新启动后可以发送电子邮件,但由于上述问题突然卡住了。

更新:

另请检查线程转储,当我检查线程转储中的内部日志时,我认为它卡在了 SocketInputStream.socketRead0 上。

java rabbitmq itext xmlworkerhelper
© www.soinside.com 2019 - 2024. All rights reserved.