java.io.IOException:参数无效

时间:2009-04-23 06:49:08

标签: java cluster-computing ioexception

我有一个使用负载均衡器在群集模式下运行的Web应用程序。 它由两个tomcats(T1和T2)组成,只能处理一个DB。 T2是nfs安装到T1。这是两个节点之间唯一的差异。

我有一个生成一些文件的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()

任何提示?

路易斯

3 个答案:

答案 0 :(得分:3)

.profile中设置此行解决了问题:

ulimit –n 2048

答案 1 :(得分:1)

dataFileList和fileNameList有多大?你可能会用完文件描述符。但它很奇怪它发生在close()上。

答案 2 :(得分:1)

最后我找到了原因。 首先我注意到并非总是出现这种异常 在同一点上。

有时是一个     java.io.IOException:参数无效         at java.io.FileOutputStream.close0(Native Method)         在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 文件系统。

在shell上进行测试以跨越节点进行编写(如果正在编写一个小节点) 文件。即:

在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。