java.io.ioexception : 잘못된 인수
-
13-09-2019 - |
문제
로드 밸런서가있는 클러스터 모드에서 웹 응용 프로그램이 실행 중입니다. 하나의 DB 만 해결하는 2 개의 Tomcats (T1 및 T2)로 구성됩니다. T2는 T1에 장착 된 NFS입니다. 이것은 두 노드 사이의 유일한 배위입니다.
일부 파일을 생성하는 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
마침내 나는 그 이유를 찾았다. 먼저 나는 항상이 예외가 같은 시점에 있다는 것을 알았습니다.
때때로 java.io.ioexception : java.io.fileoutputstream.close0 (avileoutputstream.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)을 사용하는 것입니다.
다른 팁
이 줄을 설정합니다 .profile
문제를 해결했습니다.
ulimit –n 2048
DataFilelist와 Filenamelist는 얼마나 큰가요? 파일 디스크립터가 부족할 수 있습니다. 그러나 Close ()에서 발생하는 것은 이상합니다.