遭遇诡异的 EOFException


在某重要客户生产环境上遇到这个问题。在对某系统做升级的时候,该系统需要从服务器上获取升级需要的文件,然后解压,再进行升级操作。操作过程就遇到了这个奇怪的问题。

在这里服务器管理着几十台这样类似的系统,这些系统都处理相同的网络环境中,95%的系统都可以成功升级了,剩下少数的几个系统不能升级,后台都抛出以下EOFException异常,而且这些系统所用的操作系统是Windows 2003.


......
java.io.EOFException: Unexpected end of ZLIB input stream
	at java.util.zip.InflaterInputStream.fill(InflaterInputStream.java:240)
	at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:158)
	at java.util.zip.GZIPInputStream.read(GZIPInputStream.java:117)
	at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
	at java.io.BufferedInputStream.read1(BufferedInputStream.java:286)
	at java.io.BufferedInputStream.read(BufferedInputStream.java:345)
	at org.apache.commons.compress.archivers.tar.TarBuffer.readBlock(TarBuffer.java:224)
	at org.apache.commons.compress.archivers.tar.TarBuffer.readRecord(TarBuffer.java:195)
	at org.apache.commons.compress.archivers.tar.TarArchiveInputStream.read(TarArchiveInputStream.java:486)
	at ......
	.........
	.........
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)
	......

根据EOFException的解释,在读某东西时突然达到了该文件或流的结尾,可能主要是跟没有正确使用输入输出之类的有关。审查代码,没发现有这类的问题,而且大部分系统都可以升级啊,只有那么少数的几台Windows 2003不能升级。
    

java.io.EOFException

Signals that an end of file or end of stream has been reached unexpectedly during input.

This exception is mainly used by data input streams to signal end of stream. Note that many other input operations return a special value on end of stream rather than throwing an exception. 



碰到问题,当然少不了度娘,找到以下几个类似的,主要是跟没有正确关闭输入输出相关的对象所造成的。要是有这方面的问题那还比较容易找啊,把这些使用到的输入输出的对象,检查一下,那个是需要关闭的而没关闭的,就把它关闭。:( 没发现代码存在这样的问题。


	http://bbs.csdn.net/topics/390763463 :没有关闭输出流
	http://www.tuicool.com/articles/rmMFvuF : 多次读写输入流
	http://blog.csdn.net/launch_225/article/details/7950570 : 好像也跟输入输出有关
	http://www.oschina.net/question/553061_88397 :不知道有没有最终解决

在代码上找不出问题了,接着在客户环境上找问题。就针对指定的那几台不能成功升级的机器来找,检查网络状态、检查文件权限、检查操作用户权限、检查磁盘空间是否足够,等等外部因素都开始检查了,还是没发现问题,甚至还把客户那边要升级的文件及已下载的文件,还是要升级的系统,都拿到我们本地,都没发现有这问题,奇怪。

问题还是没能解决,还是需要继续花时间找原因。

某一天,客户说,在其中的一台机器上,把系统对应的服务重启了一下,就可以升级了,我晕死了。。。这是什么原因呢?

我们的系统被弄成Windows服务,然后通过这个服务来启动我们的系统。因为这个是客户的生产环境,我们不能随便建议客户重新启动服务、或者重新启动系统的,一般是客户在打补丁的时候才会重启系统,这回重启服务,就直接把问题给解决了。

现在,我怀疑是Windows 2003系统的问题,程序运行时间过长了,容易莫名其妙地出现些奇怪的问题,这样的解释,合理吗? :)

你可能感兴趣的:(工作所遇问题,java,web,开发)