问题标签 [java-failsafe]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
2206 浏览

java - 如何在向另一个应用程序发送数据时实施重试策略?

我正在开发我的应用程序,它将数据发送到zeromq. 以下是我的应用程序的作用:

  • 我有一个SendToZeroMQ将数据发送到 zeromq 的类。
  • 将相同的数据添加到retryQueue同一类中,以便稍后在未收到确认时重试。它使用具有最大大小限制的番石榴缓存。
  • 有一个单独的线程从 zeromq 接收先前发送的数据的确认,如果未收到确认,SendToZeroMQ则将重试发送相同的数据。如果收到确认,我们会将其删除,retryQueue这样就无法再次重试。

想法很简单,我必须确保我的重试策略运行良好,这样我就不会丢失我的数据。这是非常罕见的,但如果我们没有收到确认。

我正在考虑构建两种类型,RetryPolicies但我无法理解如何在此处构建与我的程序相对应的:

  • RetryNTimes:在这种情况下,它将重试 N 次,每次重试之间都有特定的睡眠,之后,它将删除记录。
  • ExponentialBackoffRetry:在这种情况下,它将以指数方式继续重试。我们可以设置一些最大重试限制,之后它不会重试并会删除记录。

下面是我的SendToZeroMQ类,它将数据发送到 zeromq,也从后台线程每 30 秒重试一次,并启动ResponsePollerrunnable,它会一直运行:

下面是我的ResponsePoller课程,它轮询来自 zeromq 的所有确认。如果我们从 zeromq 得到确认,那么我们将从重试队列中删除该记录,这样它就不会被重试,否则它将被重试。


问题:

正如您在上面看到的,我encodedRecords使用类发送到 zeromq SendToZeroMQ,然后它每 30 秒重试一次,具体取决于我们是否从ResponsePoller类中得到了确认。

对于每一个encodedRecords都有一个唯一的键address,这就是我们将从 zeromq 中得到的作为确认的键。

我该如何继续并扩展此示例以构建我上面提到的两个重试策略,然后我可以选择在发送数据时要使用的重试策略。我想出了下面的界面,但后来我不明白我应该如何继续实施这些重试策略并在上面的代码中使用它。

我可以在这里使用番石榴重试故障安全,因为这些库已经有很多我可以使用的重试策略吗?

0 投票
1 回答
1677 浏览

java - Failsafe - 当超过重试次数时执行一些操作并再试一次

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

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

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

0 投票
1 回答
1242 浏览

java - 如何为进行后退重试的方法编写单元测试?(在 Java 中使用 FailSafe)

这是我想测试的方法:

重试策略如下所示:

此方法调用服务 X 并在特定条件下重试对服务 X 的调用(来自 X 的响应没有特定值)。每次重试都是通过延迟和退避完成的。测试看起来像这样:

我正在编写一个测试来验证服务 X 在满足条件时被调用 3 次(允许的最大重试次数为 3 次)。

由于延迟和退避,单元测试需要太多时间。在这种情况下我们应该如何编写测试?

我想到的一种解决方案是对 RetryPolicy 进行单独的测试,它应该重试 3 次,并单独测试它在满足条件时重试的事实。

我该怎么做?

0 投票
2 回答
5105 浏览

java - 使用 RetryPolicy 和 CircuitBreaker 进行故障保护会引发 CircuitBreakerOpenException

我正在尝试将重试策略与具有 Failsafe 的 CircuitBreaker 模式相结合,但是当尝试在电路打开并中断时出现 CircuitBreakerOpenException 异常。

https://github.com/jhalterman/failsafe

问题是通过将重试延迟设置为小于电路的关闭时间而产生的。

如何控制此异常,使重试策略不中断?我想这样做是因为我可以让多个同时实例向休息服务发起请求,并且重试不会中断。

我的代码:

我的结果:

0 投票
1 回答
1405 浏览

java - Failsafe RetryPolicy - 从 supplyAsync 抛出异常

我正在实施重试策略。基本上我想要做的是在单独的线程上重试 POST 请求。我正在使用 jhalterman 的故障安全(https://github.com/jhalterman/failsafe#asynchronous-api-integration)这是我的代码

我不想在这里捕获 IOException。它由重试策略处理。目前重试不会发生,因为我在这里发现了异常。有没有办法从“supplyAsync”抛出异常,以便由重试策略处理?谢谢。谢谢

0 投票
1 回答
513 浏览

java - 故障安全“运行”方法的机制

我正在使用Failsafehttps://github.com/jhalterman/failsafe)作为我的重试逻辑框架,并想了解更多关于故障安全的“运行”方法的工作原理。

假设我有:

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

0 投票
1 回答
53 浏览

java - 为什么在迭代期间从 ArrayList 中删除元素时我没有收到 ConcurrentModificationException

我正在使用以下代码循环遍历数组列表,然后从数组列表中删除一个元素。

在这里,我期待 ConcurrentModificationException。但没有得到那个例外。特别是当您使用第 (n-1) 个元素检查条件时。请帮我。下面是我的代码。

提前致谢

0 投票
1 回答
731 浏览

java - Jodah Failsafe Library Timeout 花费的时间比预期的要长

我有一种情况,我想实现 API 重试机制。假设我有一个调用第三方 API 的 API,其中正常响应时间低于 2 秒,但有时我们收到一条错误消息,显示“服务不可用”、“网关超时”等。

所以我上网看看我们是否有一个图书馆来处理这些事情,我发现了https://jodah.net/failsafe/


使用库的目的:-

如果不到 5 秒,我没有得到结果,我将取消当前调用的执行并再试一次。

为此,在库中我可以看到我们有超时重试策略

首先我正在尝试超时。

但是在计算时间时,我在调用 API 和接收之间有 20 秒的延迟TimeoutExceededException,因为持续时间应该是 1 秒Duration.ofMillis(1000)。下面你可以看到 21 秒的差异。

你能告诉我我在这里做错了什么吗?

二是重试策略

我希望TimeoutExceededException在假设 3 秒后发生异常,延迟 1 秒,再次触发请求,最多重试 3 次。我用它作为

0 投票
1 回答
203 浏览

java - ConcurrentSkipListSet 如何拥有弱一致的迭代器?理解“弱一致”的含义

快速失败的迭代器迭代集合。如果集合在迭代时被修改,我们会得到异常。相反适用于故障安全,其中迭代发生在一个集合上,而写操作发生在它的副本上,因此这就是故障安全的工作方式(fe CopyOnWriteArrayList)。

有人可以解释一下 ConcurrentSkipListSet 如何具有故障安全功能吗?修改集合时没有副本(就像 CopyOnWrite 类一样),那么它是怎么发生的呢?我阅读是因为它的迭代器是弱一致的。我阅读了文档,我仍然不明白。(但我确实知道并发中的代码可见性或发生之前的关系是什么)。

有没有人有逻辑和易于记忆的解释,因为我是初学者?

//例子:

我期待在这里抛出 ConcurrentException ..请帮助:(

0 投票
1 回答
88 浏览

java - java.util.ConcurrentModificationException 同时改变一个对象

我正在迭代一个 CustomObject 列表,并且在执行此迭代时,我通过向此自定义对象的标签列表添加一个标签来改变此对象。我没有在 customObjects (List) 中添加或删除任何 CustomObject。我仍然收到 java.util.ConcurrentModifcationException。

这是堆栈跟踪:

这是否意味着即使我们只是尝试修改对象而不是从列表/集合中删除或添加,我们也可以获得 ConcurrentModifcationException?