gpt4 book ai didi

servlets - Java Servlet 和 ImageIO 错误

转载 作者:行者123 更新时间:2023-12-04 23:56:58 24 4
gpt4 key购买 nike

我正在尝试编写一个查看某些 DICOM 文件的 WebApplication。我的想法是通过调用我的 servlet 将 DICOM 文件即时转换为 JPEG。
我使用 dcm4che 2.0.27 来转换文件。

servlet 被称为

<img src="pathToServlet/PathToDICOMFile">.

问题:当我有很多标签(当然处理不同的 DICOM 文件)时,有时我会收到 java.util.ConcurrentModificationException 类型的异常

这是方法,我的 servlet 正在调用:
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 个地方抛出异常:
  • ImageIO.getImageReadersByFormatName("DICOM");
  • myJpegImage = reader.read(0, param);
  • 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 不是线程安全的?我能做些什么来解决这个问题?
    非常感谢您的帮助和最好的问候!

    最佳答案

    这两行:

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

    只需在您的应用程序加载或 servlet 初始化时执行一次。特别是第一行 ImageIO.scanForPlugins()确实在内部改变 ImageIO 类使用的共享数据。这可能是您并发修改异常的原因。考虑将这两行移至 servlet 过滤器,或移至 init(ServletConfig) servlet 的方法。

    关于servlets - Java Servlet 和 ImageIO 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15432462/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com