Java | 「リトライ処理」を安全に書く最善の方法

Java Java
スポンサーリンク

では、do...while を使った 安全なリトライ処理のサンプル を作ります。
ポイントは次の通りです:

  • 最大試行回数の制御
  • 例外処理付き
  • ログ出力付き
  • 待機時間付き(指数バックオフ簡易版)

import java.io.IOException;
import java.util.Random;

public class DoWhileRetryExample {

    public static void main(String[] args) {
        final int MAX_RETRIES = 5;   // 最大試行回数
        int attempt = 0;
        boolean success = false;

        do {
            attempt++;
            try {
                System.out.println("試行 " + attempt + " 回目: API呼び出し中...");
                callApi(); // 実際の処理(例: ネットワーク通信)
                success = true;
                System.out.println("API呼び出し成功!");
            } catch (IOException e) {
                System.err.println("失敗: " + e.getMessage());
                if (attempt < MAX_RETRIES) {
                    try {
                        // 待機(簡単な指数バックオフ)
                        long waitTime = attempt * 1000L; // 1秒、2秒、3秒...
                        System.out.println("再試行まで " + waitTime/1000 + " 秒待機");
                        Thread.sleep(waitTime);
                    } catch (InterruptedException ie) {
                        Thread.currentThread().interrupt();
                        System.err.println("待機中に割り込み発生");
                        break; // ループを抜ける
                    }
                } else {
                    System.err.println("最大試行回数に達したため処理を中止");
                }
            }
        } while (!success && attempt < MAX_RETRIES);

        if (!success) {
            System.out.println("処理に失敗しました。運用担当者に連絡してください。");
        }
    }

    // 疑似API呼び出し(ランダムに成功/失敗)
    private static void callApi() throws IOException {
        if (new Random().nextBoolean()) {
            throw new IOException("API通信エラー");
        }
    }
}
Java

ポイント

  1. do…while を使用
    • 「最低1回は処理を実行する」ことを保証。
  2. 安全なループ条件
    • !success && attempt < MAX_RETRIES
    • 成功したら即終了、上限に達したら自動終了。
  3. 例外対応
    • IOException を捕まえ、ログに出力。
    • InterruptedException も適切に処理。
  4. 再試行待機
    • Thread.sleep(attempt * 1000L) で、再試行間隔を徐々に長くしてサーバー負荷を軽減。
  5. 運用向けメッセージ
    • 最大回数到達時や最終失敗時に、担当者向けの案内メッセージも表示。

💡 このパターンは 外部API呼び出し、DB接続、ファイルアクセスなどで現場でよく使われます。

タイトルとURLをコピーしました