当前位置: 首页 > 知识库问答 >
问题:

故障保护-超过重试次数时执行一些操作,然后再试一次

黄淇
2023-03-14

我有一个用例,需要调用UPDATE/DELETE Rest endpoint,它可能会返回关于实体被锁定以进行编辑的异常。我想等待实体解锁一段时间,否则调用force unlock endpoint并再次调用我的原始请求。这在故障保护中是可能的吗?

到目前为止我试过:

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);
}

然而,用这种方法,我必须自己做最后一次“重试”,不能得到这个动作的结果。

共有1个答案

宇文飞翮
2023-03-14

看起来这很管用。

private <R, T> R lockRetryExecution(String elementUrl, Callable<R> task) {
    return Failsafe.with(lockRetryPolicy)
        .onRetriesExceeded((o, throwable) -> forceUnlock(elementUrl))
        .withFallback(task)
        .get(task);
}
 类似资料:
  • 这是我的一个面试问题。我们有一个硒测试类,有5,6个硒测试。 测试3正在执行中,发生了网络故障。现在一旦网络恢复,如何配置框架,使它应该从失败的地方开始,就像从第三次测试开始一样。并且应该执行已经执行的测试1和2。假设framework是JUnit。

  • 我计划将我们的一个Spark应用程序迁移到Apache Flink。我试图了解它的容错特性。 我执行了以下代码,我看不到Flink实际上尝试重试任何任务(或子任务)。这可能会导致我丢失数据。我该怎么做才能确保每一次失败都能被Flink所覆盖? 我希望在屏幕上多次看到抛出异常消息。但是,当我使用fixedDelayRestart时,它似乎只是忽略了此消息,并为其他消息继续。

  • 我正在运行spring boot,KafkaListener是我的客户。问题是我们如何从失败的kafka配置中恢复,并避免应用程序在退出代码为0的过程结束时停止。例如,不正确的配置可能是不正确的endpointurl。如果无法访问Kafka服务器,也会出现同样的情况。因此,在任何情况下,KafkaListner进程都不应该杀死服务器。 ontext.java:895应用程序上下文异常:未能启动be

  • 我有一个登录表单,在单击时调用以下函数。 然后使用重定向 但我面临的问题是,当我第一次登录时,重定向无法工作。它设置了所有的cookie等等,但是它从来没有将用户重定向到想要的目录。所以我被迫在浏览器搜索栏中输入我想要的路由来重定向自己。 这意味着,一旦我强迫自己进入想要的目录,如果我注销(基本上删除cookies),并尝试再次登录。这一次重定向起作用了。 在我用Ctrl+F5清除所有缓存之前,它

  • 问题内容: 我经常遇到如下情况: 仍然需要尝试-最终在内部捕获块。 克服此问题的最佳实践是什么? 问题答案: 写一个类,其中包含捕获和记录此类异常的方法,然后根据需要使用。 您最终会看到如下内容: 您的客户端代码将类似于: 更新: 自Java 7开始,各种JDBC接口都得到了扩展,而以上代码回答了原始问题,如果您直接针对JDBC API编写代码,则现在可以对其进行结构化:

  • 问题内容: 我有一个yeoman脚手架应用程序(全栈角度生成器)。 可以正常工作,但是会产生锁定内存的分布,这很可能是因为角度中的圆形引用。 我将angular升级到了。我得到的错误是: 升级之前,错误为: 调试非常困难,因为它仅在构建/缩小之后才发生。我所有的模块都是angular的数组格式,因此最小化DI应该不是问题,而是这样。 没有单个脚本会导致这种情况。它唯一消失的方法是,如果我不使用我的