故障安全"run"方法的机理



我正在使用Failsafe(https://github.com/jhalterman/failsafe(作为我的重试逻辑框架,并想更多地了解故障保护的"运行"方法是如何工作的。

假设我有:

void MyCurrentFunction(parameter) {
    Failsafe.with(MY_RETRY_POLICY)
            .run(() -> runJob(parameter));
    OtherFunction1();
}

那么当MyCurrentFunction运行时,Failsafe.run会阻止执行MyCurrentFunction吗?换句话说,OtherFunction1会在所有重试完成之前执行吗?

这是检查您的问题的代码(注意:代码与故障安全 2.0 相关(

private RetryPolicy<Object> MY_RETRY_POLICY = new RetryPolicy<>()
        .handle(RuntimeException.class)
        .withMaxRetries(3);
private void myCurrentFunction() {
    Failsafe.with(MY_RETRY_POLICY)
            .run(() -> runJob());
    otherFunction1();
}
private void otherFunction1() {
    System.out.println("OtherFunction1");
}
private void runJob() {
    System.out.println("run job...");
    throw new RuntimeException("Exception");
}

答案是否定的; 在所有重试完成之前,不会执行OtherFunction1
实际上,如果所有重试都失败OtherFunction1将永远不会被调用。

这是测试代码的输出

run job...
run job...
run job...
run job...
java.lang.RuntimeException: Exception

不过,您可以修改重试策略以执行OtherFunction1
1( 每次重试后

private RetryPolicy<Object> MY_RETRY_POLICY = new RetryPolicy<>()
        .handle(RuntimeException.class)
        .onRetry(fail -> otherFunction1())
        .withMaxRetries(3);

2( 重试失败后

private RetryPolicy<Object> MY_RETRY_POLICY = new RetryPolicy<>()
        .handle(RuntimeException.class)
        .onFailure(fail -> otherFunction1())
        .withMaxRetries(3);

相关内容

  • 没有找到相关文章

最新更新