2009-04-23 578 views
3

我有一个运行在集群模式下的负载均衡器的Web应用程序。 它包含两个tomcat(T1和T2),只处理一个数据库。 T2是nfs安装到T1。这是两个节点之间唯一的dofference。java.io.IOException:无效的参数

我有一个java方法生成一些文件。如果请求的T1 运行是没有问题的,但如果该请求是在节点2 运行我得到一个异常如下:

java.io.IOException: Invalid argument 
     at java.io.FileOutputStream.close0(Native Method) 
     at java.io.FileOutputStream.close(FileOutputStream.java:279) 

相应的代码如下:

for (int i = 0; i < dataFileList.size(); i++) { 
    outputFileName = outputFolder + fileNameList.get(i); 
    FileOutputStream fileOut = new FileOutputStream(outputFileName);       
    fileOut.write(dataFileList.get(i), 0, dataFileList.get(i).length); 
    fileOut.flush(); 
    fileOut.close(); 
} 

的异常出现在fileOut.close()

任何提示?

路易斯

+1

是否可以从T2(即Java的之外)的操作系统通常写文件? – Damo 2009-04-23 08:47:43

+0

是的,我可以。而且,当产生一个空文件时会产生错误。 – Luixv 2009-04-23 14:07:43

回答

1

最后我找到了原因。 首先我注意到并不总是这个例外来自 在同一点。

有时是 java.io.IOException异常:无效的参数 在java.io.FileOutputStream.close0(本机方法) 在java.io.FileOutputStream.close(FileOutputStream.java:279) ^^^^^

有时呈

java.io.IOException: Invalid argument 
    at java.io.FileOutputStream.writeBytes(Native Method) 
    at java.io.FileOutputStream.write(FileOutputStream.java:260) 

因此,问题是不是Java问题。甚至没有NFS问题。 问题的底层文件系统类型,它是DRBD 文件系统。

如果有人正在编写一个小的 文件,那么在外壳上进行跨节点写操作的测试工作。即:

在NFS安装节点

cd /tmp 
date > /shared/path-to-some-not-mounted-dir/today 

will work 

cat myBigFile > /shared/path-to-some-not-mounted-dir/today 

将提供以下错误

cat: write error: Invalid argument 

因此,解决方案是使用其他类型的文件系统,例如gfs。

1

多大做dataFileList和fileNameList得到什么?您可能会耗尽文件描述符。虽然它发生在close()上很奇怪。

3

设置在.profile这行解决了这个问题:

ulimit –n 2048