前提・実現したいこと
javaプログラムでNFS共有領域ファイルへの書き込み処理中にI/Oエラーが発生した際、IOExceptionで終了させたいのですが、上手く行かずハングしてしまいます。
「試したこと」に記載の環境、シナリオでNFSのI/Oエラーによりjavaプログラムを終了させるにはどのようにコーディングしたらよろしいでしょうか。
(正確には終了させなくても構いません。javaでNFSのI/Oエラーを検知させることが目的です)
発生している問題・エラーメッセージ
javaプログラムが書き込み中にハングアップしてしまう。
IOExceptionで拾えない?
該当のソースコード
import java.io.File;
import java.io.FileWriter;
import java.io.BufferedWriter;
import java.io.PrintWriter;
import java.io.IOException;
import java.math.BigDecimal;
class write_test{
public static void main(String args[]){ File file = new File("/NFS/write_test.txt"); if (checkBeforeWritefile(file)){ try(PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file)));){ for (double i = 1; i <= 120000; i++) { Thread.sleep(1); pw.println(BigDecimal.valueOf(i * 0.001).toPlainString() + "秒経過"); } }catch(IOException e){ e.printStackTrace(); System.out.println(e); System.exit(5); }catch(InterruptedException e){ System.out.println("try-catchが必要です。"); } }else{ System.out.println("ファイルに書き込めません"); } } private static boolean checkBeforeWritefile(File file){ if (file.exists()){ if (file.isFile() && file.canWrite()){ return true; } } return false; }
}
試したこと
■環境
・rhel7
・nfs v3
マウントオプション:soft,timeo=50,retran=2
・java version "1.7.0_171"
■シナリオ
①/NFSに「soft,timeo=50,retran=2」オプションでNFSマウントします。
(NFSサーバがダウンした場合、ls等のコマンドに対して2分程でI/Oエラーが返ります。)
②上記のjavaプログラムを実行します。
(1000ミリ秒間隔で①の領域にあるテキストファイルに2分間書き込みします。)
③NFSサーバのサービスを止めます。
④2分ほど待ってNFSのI/Oエラーによりjavaプログラムがエラーを検知して終了すること。
補足情報(FW/ツールのバージョンなど)
不足情報がありましたらご指摘願います。
回答1件
あなたの回答
tips
プレビュー