Программа Java зависает в XMLWorkerHelper.getInstance().parseXHtml
У меня сейчас в производстве возникает такая проблема, которая иногда возникает. Для контекста я использую RabbitMQ и потребитель, называемый службой электронной почты, RabbitMQ — это мой сервер обмена сообщениями, а служба электронной почты отвечает за преобразование строки 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, когда я проверяю внутренние журналы в дампе потока.