では、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ポイント
- do…while を使用
- 「最低1回は処理を実行する」ことを保証。
- 安全なループ条件
!success && attempt < MAX_RETRIES- 成功したら即終了、上限に達したら自動終了。
- 例外対応
IOExceptionを捕まえ、ログに出力。InterruptedExceptionも適切に処理。
- 再試行待機
Thread.sleep(attempt * 1000L)で、再試行間隔を徐々に長くしてサーバー負荷を軽減。
- 運用向けメッセージ
- 最大回数到達時や最終失敗時に、担当者向けの案内メッセージも表示。
💡 このパターンは 外部API呼び出し、DB接続、ファイルアクセスなどで現場でよく使われます。
