質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.76%

  • Java

    13166questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Linux

    3500questions

    Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

  • NFS

    29questions

    NFS (Network File System) とは、ネットワークを介して外部ストレージにアクセスするための分散ファイルシステムです。

javaで"NFS: Stale file handle"を拾いたい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 136

gaccha

score -1

 前提・実現したいこと

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/ツールのバージョンなど)

不足情報がありましたらご指摘願います。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • asahina1979

    2018/05/01 21:58

    検知したいのは IOException ではなく IOError なきがする

    キャンセル

  • gaccha

    2018/05/02 03:38

    なるほど~。それなのかも知れませんね!!ちょっと検証してみます!!

    キャンセル

回答 1

check解決した方法

-1

解決

com.sunパッケージのXFile、XFileWriterを使用することでNFSのI/Oエラーを検知出来ました。 com.sunパッケージは以下から入手しました。 リンク内容 ※com.sunパッケージを全てコンパイルするには、上記以外にもう少しクラスが必要です。 (sun.net.wwwパッケージのクラスとかetc)

・PrintWriterクラスはIOExceptionをスローしない事の認識不足でした。
・XFileWriterは不要でした。普通にFileWriterクラスを渡したBufferedWriterでIOExceptionを拾えました。
・IOErrorに関しては今回使用したクラスではスローしないようです。(Consoleクラスではスローする模様)

懸念

上記解決方法では、結局のところBufferedWriterとPrintWriterは使わず、FileWriterで書き込みしているのと同等です。(XFileWriter.writeで書き込み処理を行うように修正しました。) ※BufferedWriterにXFileオブジェクトを渡してもI/Oエラーは検知出来ませんでした。。。

できればXFileWriterでの書き込みでなく、BufferedWriterとPrintWriterで書き込みを行いつつI/O Exceptionを検知したいのですが・・・。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    Javaにおけるfinally

    import java.io.FileWriter; import java.io.IOException; public class n1{     public static

  • 解決済

    Javaでcsvファイルを編集して出力したい

    タイトル通りですが、コーディングしたのですが、なかなか思い通りに行きません。 問題はこちらです。 下記部分をInput.csvとしてファイルを作成し、 英語の得点を全て+10した

  • 解決済

    BufferedWriter, BufferedReader を使った書き込み

    import java.IO.*; Javaでlog.txtというファイルに、改行して下へ下へ書き込みをしていきたいのですが、コンパイルはできますが思うように動いてくれません。 以

  • 受付中

    社員情報のプログラム

    社員情報のプログラム (JAVA) プログラの機能 (1)社員情報の追加 入力項目としては、社員番号、氏名(性、名)、生年月日(年、月、日) (3)で読み込んだ情報を追加する仕

  • 解決済

    try catch finally 文のテキストがコンパイルエラー

    始めまして。初心者で学習中のものです。 いま使用している教材(Java8対応と謳っている)でtry catch finally文の説明の項目があるのですが、例題があり「以下の

  • 解決済

    ArrayListの要素をテキストファイルに書き込み。よろしく御願い致します。

    目的 ArrayListの要素をremoveで削除した後に、残った要素をテキストファイルへ書き込み 問題点 削除後に、要素ではなく下記のように要素のアドレス?が

  • 受付中

    ファイルのコピー

    Java開発初心者です。 ファイルのコピーを行うコードを書いています。 FileInputStreamとFileOutputStreamを使って、 コピーしたいファイ

  • 解決済

    会員情報システム(Java)での作り方

    javaで会員情報システムのようなものを作りたいです。 下記の実行結果(コマンドプロンプトで実行)になるような、登録プログラムを作成したいのですが、作成方法が分かりませんので、教

同じタグがついた質問を見る

  • Java

    13166questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Linux

    3500questions

    Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

  • NFS

    29questions

    NFS (Network File System) とは、ネットワークを介して外部ストレージにアクセスするための分散ファイルシステムです。