JasperReports中的java.util.ConcurrentModificationException

我们在Windows上部署了一个Web应用程序到Websphere 6.1.0.19。 我们偶尔会在一些报告中看到这个ConcurrentModificationException。 我们在生产中使用JasperReports 2.0.5。 完整的堆栈跟踪如下:

 java.util.AbstractList中的java.util.ConcurrentModificationException $ Itr.checkForComodification(AbstractList.java:464),位于net.sf.jasperreports.engine.data的java.util.AbstractList $ Itr.next(AbstractList.java:435)。 JRBeanCollectionDataSource.next(JRBeanCollectionDataSource.java:91)位于net.sf.jasperreports.engine.fill.JRFillDataset.advanceDataSource的com.advtechgrp.bop.medical.reports.core.implementation.MedicalReportDataSourceImpl.next(MedicalReportDataSourceImpl.java:61) JRFillDataset.java:830)net.sf.jasperreports.engine.fill.JRFillDataset.next(JRFillDataset.java:748)at net.sf.jasperreports.engine.fill.JRBaseFiller.next(JRBaseFiller.java:1438)at net .sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:111)at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:895)at net.sf.jasperreports.engine.fill .JRBaseFiller.fill(JRBaseFiller.java:817)位于net.sf.jasperreports的net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:89)。  engine.JasperFillManager.fillReport(JasperFillManager.java:601)at com.advtechgrp.bop.medical.reports.core.MedicalReportBase.getReportList(MedicalReportBase.java:160)at com.advtechgrp.bop.medical.reports.core.implementation。 MedicalReportCreator.createJasperExporter(MedicalReportCreator.java:275)at com.advtechgrp.bop.medical.reports.core.implementation.MedicalReportCreator.createExporter(MedicalReportCreator.java:228)at com.advtechgrp.bop.medical.reports.core.implementation。 MedicalReportCreator.createReportUnsafe(MedicalReportCreator.java:196)at com.advtechgrp.bop.medical.reports.core.implementation.MedicalReportCreator.createReport(MedicalReportCreator.java:80)at com.advtechgrp.bop.medical.reports.core.web。 MedicalReportServlet.doPost(MedicalReportServlet.java:132)位于javax.servlet.http.HttpServlet.service(HttpServlet.java:763),位于com.ibm.ws的javax.servlet.http.HttpServlet.service(HttpServlet.java:856) com.ib上的.cache.servlet.ServletWrapper.serviceProxied(ServletWrapper.java:282)  m.ws.cache.servlet.CacheHook.handleFragment(CacheHook.java:459)位于com.ibm.ws.cache.servlet的com.ibm.ws.cache.servlet.CacheHook.handleServlet(CacheHook.java:265)。 ServletWrapper.service(ServletWrapper.java:262)位于com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1075)的com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java: 1016)在com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:118)的com.ibm.ws.webcontainer.filter.WebAppFilterChain._doFilter(WebAppFilterChain.java:87)com.ibm.ws上.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:771)位于com.ibm.ws.webcontainer.servil.ServletWrapper.handleRequest的com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:679) (ServletWrapper.java:546)位于com.ibmws.webcontainer.webapp.WebAppRequestDispatcher.forward的com.ibm.ws.wswebcontainerservlet.ServletWrapper.handleRequest(ServletWrapper.java:478)(WebAppReques  tDispatcher.java:321)com的com.advtechgrp.bop.medical.web.filter.UrlRewritingFilter.doFilter(UrlRewritingFilter.java:132)at com.ibm.ws.webcontainer.filterFilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:190)at com .ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:130)at com.advtechgrp.bop.medical.web.filter.GZIPFilter.doFilter(GZIPFilter.java:36)at com.ibm.ws.webcontainer .filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:190)at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:130)at com.advtechgrp.bop.medical.web.filter.WebLogFilter.doFilter (WebLogFilter.java:69)位于com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:190)的com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:130)at at com.advtechgrp.bop.medical.web.filter.SecurityFilter.doFilter(SecurityFilter.java:174)at com.ibm.ws.webcontainerfilter.FilterInstanceWrapper.doFilter(Fil 来自com.ibm.ws.webcontainer.filter.WebAppFilterChain._doFilter(WebAppFilterChain.java:87)的com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:130)中的terInstanceWrapper.java:190)位于com.ibm.ws.webcontainer.servlet的com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:679)上的.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:771) com.ibm.ws.wswebcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:478)中的.ServletWrapper.handleRequest(ServletWrapper.java:546)位于com.ibm.ws.webcontainer.servlet.CacheServletWrapper.handleRequest(CacheServletWrapper.java) :90)com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:744)com.ibmws.webcontainer.channel上的com.ibm.ws.wswebcontainer.WebContainer.handleRequest(WebContainer.java:1455)。 WCChannelLink.ready(WCChannelLink.java:115)at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.j)  ava:458)com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewInformation(HttpInboundLink.java:387)at com.ibm.ws.http.channel.inbound.impl.HttpICLReadCallback.complete(HttpICLReadCallback。 java:102)com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:165)at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217)at com.ibm位于com.ibm.io.async.ResultHandler.complete(ResultHandler.java)的com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:136)上的.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161) :195)com.ibm.io中的com.ibm.io.Async.ResultHandler.runEventProcessingLoop(ResultHandler.java:743)com.ibmio.async.ResultHandler $ 2.run(ResultHandler.java:873)com.ibm.ws.util.ThreadPool $ Worker.run(ThreadPool.java:1473) 

谢谢,
汤姆

这是由迭代器的后备存储在迭代器使用时被更改引起的。 这不是与线程相关的并发问题,因为它也很容易在单个线程上执行。

关于这个问题的更详细的描述

如果你可以修复它或者Jasper代码中的错误,你现在面临的最大问题是。

JasperReports现在是3.5版本,因此可能值得检查2.0.5(您的版本)之后的更改是否已解决任何线程问题。 这显然无法解决您当前的生产问题,但可能会使用新版本进行重建。

说完所有这些(并且不熟悉JasperReports)我会怀疑客户端线程代码。