У меня есть устаревшее приложение, использующее itext 5.5.6 на java 1.8.0_171 64 бит, которое работает на сервере приложений Websphere ND 9.0.5.13 и Windows Server 216 Standard Version 1607 64 Bit, и я использую его для преобразования HTML в PDF Я столкнулся с проблемой, когда от конечного пользователя было введено очень большое слово (до 30 тысяч символов), например:
ааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааа ааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааа....до 30 тысяч символов
это приводит к тому, что Itext зависает в следующей строке и не генерирует никаких исключений:
document.add(myPdfPTable) Такого поведения не происходит на сервере Tomcat
ниже мой код:
public DocumentgeneratePDF(String fontPath,String html) выдает исключение { com.itextpdf.text.Document document = новый com.itextpdf.text.Document(PageSize.A4, 20, 20, 100, 50); ByteArrayOutputStream baos = новый ByteArrayOutputStream(); pdfWriter = PdfWriter.getInstance(документ, баос); pdfWriter.setPageEvent(ppaHeaderFooter); pdfWriter.setViewerPreferences(PdfWriter.PageModeUseOC); pdfWriter.setPdfVersion(PdfWriter.VERSION_1_5); документ.открыть(); document.addAuthor(имя автора); document.addCreator(имя автора); document.addSubject(имя файла); документ.addCreationDate(); document.addTitle(имя файла); Шрифт arabicFont = FontFactory.getFont(fontPath, BaseFont.IDENTITY_H, 14); FontFactory.register(fontPath); Шрифт полужирный = FontFactory.getFont(fontPath, BaseFont.IDENTITY_H, 14f, Font.BOLD); Шрифт Regularfont = FontFactory.getFont(fontPath, BaseFont.IDENTITY_H, 10); List pdfElements = getElementsFromHtml(html, fontPath); PdfPTable contentTable = новый PdfPTable (1); contentTable.setRunDirection(PdfWriter.RUN_DIRECTION_RTL); contentTable.setSplitLate(ложь); contentTable.setWidthPercentage(90); contentTable.setExtendLastRow(истина); for (Элемент element: pdfElements) { Ячейка PdfPCell = новый PdfPCell(); cell.setHorizontalAlignment(Element.ALIGN_CENTER); cell.setVerticalAlignment(Element.ALIGN_CENTER); cell.setBorder(Rectangle.NO_BORDER); cell.setArabicOptions(ColumnText.DIGITS_EN2AN); ячейка.addElement(элемент); contentTable.addCell(ячейка); } document.add(contentTable); возвратный документ; } public ArrayList getElementsFromHtml(final String html, String fontPath) выдает IOException { окончательные элементы ElementList = новый ElementList(); Файл стиля StringBuilder = новый StringBuilder(); stylefile.append("body {размер шрифта: 14pt;font-family:MyCustomFont;line-height: 1,5;dir:rtl}"); stylefile.append("table{padding: 0px;border-spacing: 0px;font-size: 14pt;}"); stylefile.append("td{height:30px;}"); CSSResolver cssResolver = новый StyleAttrCSSResolver(); CssFile cssFile = XMLWorkerHelper.getCSS(new ByteArrayInputStream(stylefile.toString().getBytes())); cssResolver.addCss(cssFile); XMLWorkerFontProvider fontProvider = новый XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFOONTS); fontProvider.register(fontPath, "MyCustomFont"); CssAppliers cssAppliers = новый CssAppliersImpl (fontProvider); HtmlPipelineContext htmlContext = новый HtmlPipelineContext (cssAppliers); htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory()); окончательный ElementHandlerPipeline end = новый ElementHandlerPipeline (elements, null); окончательный HtmlPipeline htmlPipeline = новый HtmlPipeline (htmlContext, end); окончательный CssResolverPipeline cssPipeline = новый CssResolverPipeline (cssResolver, htmlPipeline); окончательный рабочий XMLWorker = новый XMLWorker(cssPipeline, true); окончательный XMLParser p = новый XMLParser(worker, Charset.forName("UTF-8")); окончательная строка разрешенаHtml = "" + html + ""; p.parse(new ByteArrayInputStream(resolvedHtml.getBytes(Charset.forName("UTF-8"))), Charset.forName("UTF-8")); вернуть новый ArrayList(elements); } ОБНОВЛЕНИЕ1 После включения обнаружения зависшего потока в веб-сфере я смог найти причину зависания потока:
ThreadMonitor W WSVR0605W: Поток «WebContainer: 4» (00003bed) активен в течение 672628 миллисекунд и может зависнуть. Всего на сервере есть 1 поток(и), которые могут зависнуть. по адресу com.ibm.tivoli.itcam.gdc.data.GDCInstanceDataManager.resetProvisional(GDCInstanceDataManager.java:489) на com.ibm.tivoli.itcam.gdc.GDCMethodProbePoint.customProbeEndEvent(GDCMethodProbePoint.java:1691) на com.ibm.tivoli.itcam.toolkit.ai.boot.callbacks.generic.CustomProbeCallback.customProbeAfterCallbackInstance(CustomProbeCallback.java:450) на com.ibm.tivoli.itcam.toolkit.ai.boot.callbacks.generic.CustomProbeCallback.customProbeAfterCallback(CustomProbeCallback.java:409) на com.itextpdf.text.pdf.PdfFont.width(PdfFont.java:138) в com.itextpdf.text.pdf.PdfChunk.getCharWidth(PdfChunk.java:961) на com.itextpdf.text.pdf.BidiLine.processLine(BidiLine.java:383) на com.itextpdf.text.pdf.ColumnText.go(ColumnText.java:1068) на com.itextpdf.text.pdf.ColumnText.go(ColumnText.java:990) в com.itextpdf.text.pdf.ColumnText.goComposite(ColumnText.java:1523) на com.itextpdf.text.pdf.ColumnText.go(ColumnText.java:996) на com.itextpdf.text.pdf.ColumnText.go(ColumnText.java:990) на com.itextpdf.text.pdf.PdfPCell.getMaxHeight(PdfPCell.java:1044) на com.itextpdf.text.pdf.PdfPTable.getFittingRows(PdfPTable.java:2141) в com.itextpdf.text.pdf.ColumnText.goComposite(ColumnText.java:1753) на com.itextpdf.text.pdf.ColumnText.go(ColumnText.java:996) на com.itextpdf.text.pdf.ColumnText.go(ColumnText.java:990) на com.itextpdf.text.pdf.ColumnText.go(ColumnText.java:978) на com.itextpdf.text.pdf.PdfDocument.addPTable(PdfDocument.java:2673) на com.itextpdf.text.pdf.PdfDocument.add(PdfDocument.java:750) в com.itextpdf.text.Document.add(Document.java:278) UPDATE2: обнаружил, что, наконец, файл создан, но его создание занимает около 15 минут, а размер файла составляет всего 350 КБ, но он состоит из 280 страниц, в то время как тот же запрос на tomcat 9 Java 8 выполняется за 30 секунд, поэтому, похоже, это проблема Websphere.
ОБНОВЛЕНИЕ3: судя по комментариям ниже, возможно, это проблема с мониторингом, поэтому я отключил инфраструктуру мониторинга производительности (PMI), но все еще сталкиваюсь с той же проблемой, так что, возможно, это проблема с конфигурацией аргументов JVM, поэтому вот мои аргументы JVM. :
-Dcom.ibm.jsse2.overrideDefaultProtocol=TLSv12 -Dcom.ibm.jsse2.overrideDefaultTLS=true -DFileNet.WSI.AutoDetectLTPAToken=истина -Dcom.filenet.authentication.token.userid=sso:ltpa -Dam.wasserver=сервер1 -Dam.wasnode=MyNode01 -Dam.wasprofile=AppSrv01 -Dam.wascell=MyNode01Cell -Dcom.ibm.tivoli.itcam.ai.runtimebuilder.inputs=${ITCAMDCHOME}/runtime/AppSrv01.MyNode01Cell.MyNode01.server1.DCManualInput.txt -Dws.bundle.metadata=${ITCAMDCHOME}/runtime/wsBundleMetaData -Djava.security.policy=${ITCAMDCHOME}/itcamdc/etc/datacollector.policy -Xbootclasspath/p:${ITCAMDCHOME}/toolkit/lib/bcm-bootstrap.jar -Dsun.rmi.transport.connectionTimeout=300000 -Dsun.rmi.dgc.server.gcInterval=3600000 -Dsun.rmi.dgc.client.gcInterval=3600000-verbosegc -Xgc:allocationSamplingGranularity=10000 -Xhealthcenter:transport=jrmp,level=inprocess -agentlib:am_ibm_16=${WAS_SERVER_NAME} -Djava.net.preferIPv6Addresses=false -Djava.net.preferIPv4Stack=истина -Dcom.ibm.cacheLocalHost=истина -Djaxws.payload.highFidelity=истина -Djava.security.auth.login.config=C:\FileNet\AE\config\jaas.conf.WebSphere -agentlib:getClasses Пользовательские свойства JVM:

Мобильная версия