gpt4 book ai didi

java - 为什么@PostConstruct 和@Retryable 不能一起使用?

转载 作者:行者123 更新时间:2023-11-30 08:35:30 25 4
gpt4 key购买 nike

我使用 AnnotationConfigApplicationContext 创建了一个基于 spring 框架的应用程序。

一个 bean 有一个 init 方法,它创建到外部服务的连接。这可以用 @PostConstruct 注释,以便在启动 bean 后自动运行。

为了在创建此连接时处理任何异常,我希望我的 init 方法在捕获到异常时最多重试 5 次。当用 @PostConstruct@Retryable 注释方法时,我看到异常被抛出一次并且程序退出 - 看起来 @Retryable 没有效果。

我在配置类中正确使用了 @EnableRetry@Configuration。我在同一个 bean 上创建了另一个方法 B,该方法被注释为可重试,如果在实例化 bean 之后调用此方法,我可以看到该方法在抛出异常时被重试/按预期运行。

我对为什么这不起作用的想法可能是某些方面相关,或者后构造发生在附加 spring-retry 元素之前?

实际上是否有更好的方法来拥有可以处理异常并可通过注释重试的初始化方法,而不是在方法中以编程方式尝试?

编辑:我现在同意创建与外部服务的连接不应通过@Postconstruct 完成。如果重试失败可能会产生不利影响,这可以阻止整个上下文初始化。

然而,这还没有回答 Spring 框架的哪一部分不允许这两个注释一起工作的问题。

最佳答案

To handle any exceptions when creating this connection I want my init method to retry up to 5 times if an exception is caught.

你永远不应该在初始化方法中连接到资源;您应该先等待上下文创建。

实现SmartLifecycle 并在start() 中连接会好很多。这样,您就可以确保在开始连接到外部资源之前已经初始化了整个上下文。

这样,start() 方法应该被重试拦截器通知。

正如@Naros 所建议的那样,ContextRefreshedEvent 是另一种选择,但您永远不应该在 @PostConstruct 中做那样的事情。

关于java - 为什么@PostConstruct 和@Retryable 不能一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38173435/

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