问题标签 [resilience4j-retry]

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 投票
2 回答
1321 浏览

execution - 在 Resilience4j 中集成断路器、重试和时间限制器

我正在尝试使用Resilience4j功能。

我的用例是结合 3 个模块:

  • 断路器
  • 重试
  • 限时器

我想组合所有这些模块并只执行一次该方法。

代码

这是我尝试过的。

问题

我的doSomething()方法执行两次而不是预期的一次。

有没有人之前看到过这个问题?

0 投票
1 回答
1805 浏览

java - 在使用 Spring Boot 达到最大弹性 4j 重试尝试后处理异常

我有一个场景,我想记录每次重试尝试,当最后一次尝试失败(即maxAttempts达到)时,抛出异常,假设创建了一个数据库条目。

我尝试使用带有 Spring Boot 的 Resilience4j-retry 来实现这一点,因此我使用application.yml和注释。

回退将异常原因记录到应用程序日志中。

当我调用此方法person()时,重试会按照maxAttempt配置进行。我希望我的自定义运行时MyRestException在每次重试时被捕获并在最后一次(maxAttempt达到时)抛出,所以我将调用包装在 try-catch 中。

try-catch不幸的是,当回退遇到并重新抛出立即被 my而不是 Resilience4j-retry 机制捕获的异常时,重试似乎被忽略了。

如何实现maxAttempts被击中时的行为?有没有办法为这种情况定义一个特定的后备方法?

0 投票
1 回答
1810 浏览

spring-boot - 使用注解式 Resilience4j 测试 SpringBoot

我在名为“demo”的SpringBoot 应用程序中使用注解式 Resilience4j。通过 RestTemplate 调用外部后端时,我想使用 TimeLimiter 和 Retry 来实现以下目标:

  1. 将 REST 调用持续时间限制为 5 秒 --> 如果需要更长时间,则失败并显示 TimeoutException
  2. 重试 TimeoutException --> 最多尝试 2 次

为了查看我的弹性设置的配置是否按设计工作,我编写了一个集成测试。此测试在配置文件“test”下运行,并使用“application-test.yml”进行配置:

  1. 使用 TestRestTemplate 向我的“SimpleRestEndpointController”发送呼叫
  2. 控制器调用我的业务服务“CallExternalService”,它有一个带注释的方法“getPersonById”(注释:@TimeLimiter,@Retry)
  3. 通过这个方法,一个模拟的 RestTemplate 用于在“FANCY_URL”调用外部后端
  4. 使用 Mockito 对外部后端的 RestTemplate 调用减慢(使用 Thread.sleep)
  5. 我希望 TimeLimiter 在 5 秒后取消调用,并且 Retry 确保再次尝试 RestTemplate 调用(验证 RestTemplate 是否已被调用两次)

问题: TimeLimiter 和 Retry 已注册,但没有完成它们的工作(TimeLimiter 不限制调用持续时间)。因此 RestTemplate 只被调用一次,提供空的Person(见代码澄清)。可以克隆链接的示例项目并在运行测试时展示问题。

代码application-test.yml(也在这里:链接到 application-test.yml):

此测试的代码(也在这里:链接到 IntegrationTest.java):

我的应用程序代码展示了这个问题: https ://github.com/SidekickJohn/demo

我创建了一个“逻辑”的泳道图作为 README.md 的一部分:https ://github.com/SidekickJohn/demo/blob/main/README.md

0 投票
0 回答
99 浏览

java - 带有弹簧靴的 Resilience4j

早些时候,我使用 void 方法使用 CircuitBreaker 和 Retry 注释。有效。但 Timelimiter 无法正常工作。

@Timelimiter(name = "example_tl")

@CIRCUITBREAKER(name = "example_cb", fallbackMethod = "sendDataFallBack")

@Retry(name = "example_retry", fallbackMethod = "sendDataFallBack")

公共无效方法数据(JsonObject jsondata)

我读到它只支持反应式方法。

因此,我将方法返回类型更改为 Mono。在此之后,没有任何工作。

公共 Mono..ClientResponse..methodData(JsonObject jsondata)

你能帮帮我吗?(我被困住了)

问候,斯蒂芬

0 投票
0 回答
236 浏览

java - Webflux 和 Resilience4j 重试问题

想问一个关于webflux和resilience4j重试的基本问题。我们正在使用 Webflux 和 Resilience4J(不是 Spring Cloud Circuit Breaker)运行 Java SpringBoot。在运行应用程序时出现错误(不知何故完整的堆栈跟踪不适合我):

构建 Retry bean 的代码如下(我们没有使用基于 YAML 的配置):

现在我们使用从上面注入的 bean 调用我们的 Web 客户端的 POST 方法,如下所示:

POM 依赖:

请帮忙 。

0 投票
1 回答
1623 浏览

java - 弹性4j springboot 2注释(@Retry,@CircuitBreaker)不起作用

我正在开发一个 springboot 应用程序,并想添加弹性 4j-重试机制。我做了以下步骤:

  1. 在 pom.xml 中添加了执行器、aop 和弹性4j 依赖项

  2. 在控制器中创建了一个方法,该方法将尝试命中一个虚拟服务(预计会失败)。在我的方法上添加了 @Retry 注释。

  3. 将配置添加到 application.properties

弹性4j.retry.instances.sample-api.maxAttempts=5

另外,我尝试使用 maxRetryAttempts。但没有任何改变。

我希望它重试在 application.properties 中配置的次数。但是,它只尝试一次。不确定我是否遗漏了什么。有人可以帮忙吗?

0 投票
1 回答
408 浏览

spring-boot - Resilience4j + Spring boot @Retry 不能使用异步方法

我有一个@Async尝试添加的方法,@Retry但是在发生异常时永远不会执行回退方法。我也试图测试这个抛出异常的模拟,但由于它永远不会进入回退方法,它永远不会成功。

这是我的代码:

测试:

我错过了什么吗?

谢谢!

0 投票
1 回答
457 浏览

spring - Springboot中如何根据HTTP响应码进行重试

在这种方法中,只有当我得到某些响应代码时,我才需要重试发布数据。我搜索了一些不适合我的解决方案的选项。使用注释有没有更简单的方法?

0 投票
3 回答
1048 浏览

aop - Resiliency4j CircuitBreaker 尝试在 AOP 中调用断路器逻辑,以实现在配置中禁用时不调用断路器

有条件地我想通过设置来关闭/打开断路器开关spring.cloud.circuitbreaker.resilience4j.enabled=false。我的逻辑应该不受断路器逻辑的影响。

spring.cloud.circuitbreaker.resilience4j.enabled=true我尝试使用下面的演示示例来扩展我的要求,我试图根据inapplication.property和case中true的断路器标志绑定目标方法上的断路器调用。false可能有一种更简单的方法来实现这一点,如果有任何其他解决方案而不是我尝试的解决方案,请帮助我。

示例: spring cloud circuit-breaker-resilency4j 示例

尝试调用快乐路径 - 没有异常时工作正常[响应在 3 秒内出现,因为时间限制器在 bean 创建中设置为 3 秒]

应用程序属性:

控制器:

模拟服务:

配置类:

ApplyCircuitBreaker - 自定义注释仅适用于所需方法:

AOP:CircuitBreakerAroundAspect:

我的要求: circuitBreakerFactory.create(joinPoint.getSignature().toString()) .run(() -> ....)在这一行,当目标方法抛出异常时,controll应该去回退机制调用。由于 joinPoint.proceed() 抛出异常,它强制处理异常 - 所以我在这里做错了,需要建议来解决这个问题以解决要求。

错误日志:

0 投票
1 回答
218 浏览

java - Resilience4j 使用 CompletionStage 重试

我正在使用这种方法,希望 executeCall 在引发异常时至少重试 3 次。executeCall(request) 方法返回一个 CompletionStage。

当我尝试对这段代码进行单元测试时,executeCall(request) 方法的调用次数只有一次(我在这个方法中抛出了一个异常)。

如何确保它至少重试 5 次(这是默认值)