我们在tomcat 7下运行一个servlet,它将存储的TIFF图像转换为JPEG,以便使用Java Advanced Imaging库在Web应用程序中显示。这个servlet自2011年以来一直在运行。但是,最近,它已经开始在一个非常奇怪的位置失败。我们可以毫无问题地读取TIFF图像,但是当我们尝试将转换结果写入缓存文件时,我们对ImageIO.createImageOutputStream的调用开始返回null。
我无法在tomcat日志中找到与此停止工作时相对应的任何错误。重启tomcat似乎暂时解决了这个问题,但似乎更频繁地发生了。据我所知,我们最近没有对java,tomcat或这个servlet中运行的代码进行任何更改。我们在tomcat的lib文件夹中有JAI库,而不是Web应用程序。是什么导致这个图书馆在白天突然失败?
相关代码部分:
//Get a JPEG writer and write the converted image to the output stream
ImageWriter writer = null;
Iterator<ImageWriter> writers = ImageIO.getImageWritersByMIMEType("image/jpeg");
if(writers.hasNext()){
writer = writers.next();
} else {
System.out.println("No JPEG Writer!");
return;
}
FileOutputStream fos = new FileOutputStream(cacheFile);
ios = ImageIO.createImageOutputStream(fos); //This is what is returning null
writer.setOutput(ios);
writer.write(resizedImage);
fos.close();
答案 0 :(得分:0)
无法创建输出文件时返回null。见Javadoc。您已更改了文件名,或其生成方式,或目标目录上的权限等。
与ImageIO无关。
答案 1 :(得分:0)
鉴于这不会立即发生,这可能是某种资源泄漏,无论是文件句柄的内存。你在Tomcat的标准输出中看到任何OutOfMemory吗?你能运行lsof并查看是否有太多打开的文件句柄?