0

我有一个用例,我需要调用 UPDATE/DELETE Rest 端点,这可能会返回有关实体被锁定以进行编辑的异常。我想等待一些时间来解锁实体,否则调用强制解锁端点并再调用一次我的原始请求。这有可能以某种方式进行故障保护吗?

到目前为止我尝试了什么:

lockRetryPolicy = new RetryPolicy()
            .retryOn(LockException.class)
            .withBackoff(1, 8, TimeUnit.MINUTES)
            .withMaxDuration(30, TimeUnit.MINUTES);

private <R, T> R lockRetryExecution(String elementUrl, Callable<R> task) {
    return Failsafe.with(lockRetryPolicy)
            .onRetriesExceeded((o, throwable) -> {
                forceUnlock(elementUrl);
                task.call();
            })
            .withFallback((o, throwable) -> o)
            .get(task);
}

但是,使用这种方法,我必须自己进行最后一次“重试”并且无法获得此操作的结果。

4

1 回答 1

0

看起来这行得通。

private <R, T> R lockRetryExecution(String elementUrl, Callable<R> task) {
    return Failsafe.with(lockRetryPolicy)
        .onRetriesExceeded((o, throwable) -> forceUnlock(elementUrl))
        .withFallback(task)
        .get(task);
}
于 2017-02-26T19:42:12.087 回答