>

Windows에서 Websphere 6.1.0.19에 배포 된 웹 응용 프로그램이 있습니다. 때때로 일부 보고서에서이 ConcurrentModificationException이 발생합니다. 프로덕션 환경에서 JasperReports 2.0.5를 사용하고 있습니다. 전체 스택 추적은 다음과 같습니다.

java.util.ConcurrentModificationException
      java.util.AbstractList $Itr.checkForComodification (AbstractList.java:464)에서
      java.util.AbstractList $Itr.next (AbstractList.java:435)에서
      net.sf.jasperreports.engine.data.JRBeanCollectionDataSource.next (JRBeanCollectionDataSource.java:91)에서
      com.advtechgrp.bop.medical.reports.core.implementation.MedicalReportDataSourceImpl.next (MedicalReportDataSourceImpl.java:61)
      net.sf.jasperreports.engine.fill.JRFillDataset.advanceDataSource (JRFillDataset.java:830)에서
      net.sf.jasperreports.engine.fill.JRFillDataset.next (JRFillDataset.java:748)에서
      net.sf.jasperreports.engine.fill.JRBaseFiller.next (JRBaseFiller.java:1438)
      net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport (JRVerticalFiller.java:111)
      net.sf.jasperreports.engine.fill.JRBaseFiller.fill (JRBaseFiller.java:895)에서 net.sf.jasperreports.engine.fill.JRBaseFiller.fill (JRBaseFiller.java:817)에서
      net.sf.jasperreports.engine.fill.JRFiller.fillReport (JRFiller.java:89)에서
      net.sf.jasperreports.engine.JasperFillManager.fillReport (JasperFillManager.java:601)
      com.advtechgrp.bop.medical.reports.core.MedicalReportBase.getReportList (MedicalReportBase.java:160)에서
      com.advtechgrp.bop.medical.reports.core.implementation.MedicalReportCreator.createJasperExporter (MedicalReportCreator.java:275)에서
      com.advtechgrp.bop.medical.reports.core.implementation.MedicalReportCreator.createExporter (MedicalReportCreator.java:228)
      com.advtechgrp.bop.medical.reports.core.implementation.MedicalReportCreator.createReportUnsafe (MedicalReportCreator.java:196)에서
      com.advtechgrp.bop.medical.reports.core.implementation.MedicalReportCreator.createReport (MedicalReportCreator.java:80)
      com.advtechgrp.bop.medical.reports.core.web.MedicalReportServlet.doPost (MedicalReportServlet.java:132)
      javax.servlet.http.HttpServlet.service (HttpServlet.java:763)에서
      javax.servlet.http.HttpServlet.service (HttpServlet.java:856)에서
      com.ibm.ws.cache.servlet.ServletWrapper.serviceProxied (ServletWrapper.java:282)에서com.ibm.ws.cache.servlet.CacheHook.handleFragment (CacheHook.java:459)에서
      com.ibm.ws.cache.servlet.CacheHook.handleServlet (CacheHook.java:265)에서
      com.ibm.ws.cache.servlet.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.filter.WebAppFilterManager.doFilter (WebAppFilterManager.java:679)에서
      com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest (ServletWrapper.java:546)에서
      com.ibm.ws.wswebcontainerservlet.ServletWrapper.handleRequest (ServletWrapper.java:478)에서
      com.ibmws.webcontainer.webapp.WebAppRequestDispatcher.forward (WebAppRequestDispatcher.java:321)에서
      com.advtechgrp.bop.medical.web.filter.UrlRewritingFilter.doFilter (UrlRewritingFilter.java:132)
      com.ibm.ws.webcontainer.filterFilterInstanceWrapper.doFilter (FilterInstanceWrapper.java:190)에서
      com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter (WebAppFilterChain.java:130)에서
      com.advtechgrp.bop.medical.web.filter.GZIPFilter.doFilter (GZIPFilter.java:36)에서
      com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter (FilterInstanceWrapper.java:190)에서
      com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter (WebAppFilterChain.java:130)에서
      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)에서
      com.advtechgrp.bop.medical.web.filter.SecurityFilter.doFilter (SecurityFilter.java:174)에서
      com.ibm.ws.webcontainerfilter.FilterInstanceWrapper.doFilter (FilterInstanceWrapper.java:190)에서
      com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter (WebAppFilterChain.java:130)에서com.ibm.ws.webcontainer.filter.WebAppFilterChain._doFilter (WebAppFilterChain.java:87)에서
      com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter (WebAppFilterManager.java:771)에서
      com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter (WebAppFilterManager.java:679)에서
      com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest (ServletWrapper.java:546)에서
      com.ibm.ws.wswebcontainer.servlet.ServletWrapper.handleRequest (ServletWrapper.java:478)에서
      com.ibm.ws.webcontainer.servlet.CacheServletWrapper.handleRequest (CacheServletWrapper.java:90)에서
      com.ibm.ws.webcontainer.WebContainer.handleRequest (WebContainer.java:744)에서
      com.ibm.ws.wswebcontainer.WebContainer.handleRequest (WebContainer.java:1455)에서
      com.ibmws.webcontainer.channel.WCChannelLink.ready (WCChannelLink.java:115)에서
      com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination (HttpInboundLink.java:458)에서
      com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewInformation (HttpInboundLink.java:387)에서
      com.ibm.ws.http.channel.inbound.impl.HttpICLReadCallback.complete (HttpICLReadCallback.java:102)에서
      com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted (AioReadCompletionListener.java:165)에서
      com.ibm.io.async.AbstractAsyncFuture.invokeCallback (AbstractAsyncFuture.java:217)에서
      com.ibm.io.async.AsyncChannelFuture.fireCompletionActions (AsyncChannelFuture.java:161)에서
      com.ibm.io.async.AsyncFuture.completed (AsyncFuture.java:136)에서
      com.ibm.io.async.ResultHandler.complete (ResultHandler.java:195)에서
      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)에서

감사합니다.


  • 답변 # 1

    반복자가 사용되는 동안 반복자의 백업 저장소가 변경되어 발생합니다. 단일 스레드에서도 쉽게 수행 할 수 있으므로 스레딩과 관련된 동시성 문제는 아닙니다.

    이 질문에 대한 자세한 설명

    지금 가장 큰 문제는 Jasper 코드의 버그 또는 버그로 해결할 수있는 문제입니다.

  • 답변 # 2

    JasperReports는 현재 3.5 버전이므로 변경 사항이 2.0.5 이후인지 여부를 확인하는 것이 좋습니다. (귀하의 버전)에서 스레딩 문제를 해결했습니다. 그것은현재생산 문제를 해결하지는 못하지만 새로운 버전으로 재 구축 할 수도 있습니다

    .

    JasperReports에 익숙하지 않다고 말하면서 클라이언트 스레드 코드가 의심됩니다.

관련 자료

  • 이전 testing - Android 레이아웃 XML에서 AdMob에 대한 올바른 xmlns URL은 무엇입니까
  • 다음 java - 이진 트리 구조를 통해 구현 된 이진 힙