4

私はいくつかのDICOMファイルを表示するWebApplicationを書き込もうとしています。私のアイデアは、サーブレットを呼び出して、DICOMファイルをその場でJPEGに変換することでした。私はdcm4che2.0.27を使用してファイルを変換します。

サーブレットは次のように呼ばれます

<img src="pathToServlet/PathToDICOMFile">.

問題:多くのタグがある場合(もちろん、異なるDICOMファイルをアドレス指定している場合)、java.util.ConcurrentModificationExceptionタイプの例外が発生することがあります。

これがメソッドです。私のサーブレットは次のように呼び出しています。

void convertFile(String path, OutputStream to) throws IOException {
    File myDicomFile = new File(path);

    BufferedImage myJpegImage = null;
    ImageIO.scanForPlugins();
    Iterator<ImageReader> iter = ImageIO.getImageReadersByFormatName("DICOM");

    ImageReader reader = (ImageReader) iter.next();

    DicomImageReadParam param = (DicomImageReadParam) reader.getDefaultReadParam();

    ImageInputStream iis = ImageIO.createImageInputStream(myDicomFile);
    reader.setInput(iis, false);
    myJpegImage = reader.read(0, param);
    iis.close();
    ImageIO.write(myJpegImage, "JPEG", to);

    to.close();

}

「path」はdicomファイルへの絶対パスであり、「out」は単なるresponse.getOutputStream()です。

例外は3つの場所でスローできます。

  1. ImageIO.getImageReadersByFormatName( "DICOM");
  2. myJpegImage = reader.read(0、param);
  3. ImageIO.write(myJpegImage、 "JPEG"、to);

これは、ImageIO.getImageReadersByFormatName( "DICOM")を呼び出したときにスローされたスタックトレースです。

java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextEntry(HashMap.java:806)
at java.util.HashMap$ValueIterator.next(HashMap.java:835)
at javax.imageio.spi.PartialOrderIterator.<init>(PartiallyOrderedSet.java:177)
at javax.imageio.spi.PartiallyOrderedSet.iterator(PartiallyOrderedSet.java:85)
at javax.imageio.spi.SubRegistry.getServiceProviders(ServiceRegistry.java:759)
at javax.imageio.spi.ServiceRegistry.getServiceProviders(ServiceRegistry.java:451)
at javax.imageio.spi.ServiceRegistry.getServiceProviders(ServiceRegistry.java:507)
at javax.imageio.ImageIO.getImageReadersByFormatName(ImageIO.java:708)
at example.project.dicomtest.myDicomConverter.ConvertHelper.convertFile(ConvertHelper.java:32)
at example.project.dicomtest.myDicomConverter.GetImage.doGet(GetImage.java:40)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:185)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:151)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
at org.apache.catalina.core.StandardEnginateValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:269)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)

ImageIOがスレッドセーフではないためですか?この問題を解決するにはどうすればよいですか?助けてくれてありがとう!

4

2 に答える 2

6

これらの2行:

ImageIO.scanForPlugins();
Iterator<ImageReader> iter = ImageIO.getImageReadersByFormatName("DICOM");

アプリケーションがロードされるか、サーブレットが初期化されるときに、一度だけ実行する必要があります。特に、最初の行ImageIO.scanForPlugins()は、ImageIOクラスによって内部的に使用される共有データを変更します。これは、同時変更の例外の原因である可能性があります。これらの2行をサーブレットフィルターまたはサーブレットのinit(ServletConfig)メソッドに移動することを検討してください。

于 2013-03-15T12:48:42.890 に答える
1

同期されたメソッドを使用して、同時変更を防ぐことが役立つ場合があります。この質問を読む

stackoverflow.com/questions/9884148/use-of-synchronized-method-in-affable-bean-shopping-cart

于 2013-03-15T12:37:43.943 に答える