gpt4 book ai didi

java - @Recover(后备方法)与 @CircuitBreaker 一起使用时,一旦所有重试都用尽,就不会被调用

转载 作者:行者123 更新时间:2023-12-01 18:23:59 24 4
gpt4 key购买 nike

尽管对于其他返回类型,Spring 重试回退机制似乎工作正常,但是当涉及到调用返回类型为 void 的 API 时。恢复方法根本没有被调用,我已经尝试了所有可能的方法参数类型并更改了后备方法的返回类型......有什么方法可以做到这一点吗?我不明白为什么 @CircuitBReaker 注释没有参数来获取作为值传递给它的后备方法名称?

    @CircuitBreaker(maxAttempts = 3, openTimeout = 8000, resetTimeout = 15000)
public Void callingXYZ(final Abc abc, final Cdf cdf) {
return retryTemplate.execute(context -> {
log.info("Retry count={} when calling ******", context.getRetryCount());
AbcServiceImpl.this.update*****Settings(OrgId.fromString(abc.getUUID(), cdf.getData());
return null;
});
}

//Recover method that should get invoked
@Recover
public Void fallbackUpdate*****(Throwable e, Abc abc) throws Throwable{
log.info("Inside fallback");
if (e instanceof ClientException) {
log.warn("Fallback method is called when trying to call ******** from ****** because of {}", e.getCause());

//Rollback in the db based on the method attributes
throw SpecificException.forTask(HttpStatus.SERVICE_UNAVAILABLE.value(),
Enum.NAME.getErrorCode(),
Enum.NAME.getMEssage(), true);
}
throw e;
}

最佳答案

您是否曾经使用@Transactional(或例如@Async)注释一个方法但它不起作用?好像它完全被 Spring 忽略了?这是因为像这样的注释不能(至少默认情况下)只放在任何方法上,必须满足以下两个条件才能让 Spring 采取行动:

方法可见性只能是 public。调用必须来自 bean 外部。这是由于 Spring 代理默认的工作方式(使用 CGLIB 代理)造成的。我不会深入讨论细节,因为这个主题足够宽泛,可以写另一篇文章,但一般来说,当您 Autowiring Sample 类型的 bean 时,Spring 实际上并没有为您提供确切的 Sample 实例。相反,它会注入(inject)一个生成的代理类,该代理类扩展了 Sample(这就是为什么您不能将 Spring bean 类设为最终的原因)并重写其公共(public)方法以便能够添加额外的行为(例如事务支持)。

这就是为什么带有@Transactional的方法必须是公共(public)的(这样Spring可以轻松覆盖它们),这也是为什么调用必须来自外部(只有这样它才可以通过代理,Spring不能用代理替换这个引用引用)。

取自 https://codete.com/blog/5-common-spring-transactional-pitfalls/

关于java - @Recover(后备方法)与 @CircuitBreaker 一起使用时,一旦所有重试都用尽,就不会被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60260698/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com