我正在尝试对扩展 JpaRespository 的类的方法实现重试。对于所有用 @Query 注释的方法,重试都会按预期工作(重试 3 次,如果不成功则抛出错误)。但是,当调用继承的 save() 函数并抛出数据库异常时,只会执行一次重试,然后程序会继续执行,就像查询成功一样(即使没有成功)。
MSSQL数据库连接是使用Spring Boot配置的。存储库的定义类似于以下内容:
@EnableJpaRepositories
@Repository
@Retryable(listeners = {"retryListeners"})
public interface ExampleRepo extends JpaRepository<ExampleRecord, Long>{
@Query("select * from ExampleRepo where exampleParam = :exampleParam")
List<ExampleRecord> exampleQuery(@Param("exampleParam") String exampleParam);
}
正在从另一个类的存储库实例上调用 save 方法。
exampleRepo.save(exampleRecord);
编辑添加我的 AppConfig 类如下所示:
@Slf4j
@Configuration
@EnableRetry
public class AppConfig {
// unrelated configurations
// Retry listener bean implemented similarly to this response https://stackoverflow.com/a/50704746/22562155
}
我在控制台中得到的输出按以下顺序排列:
我已经使用 IntelliJ 调试器单步执行了,我可以看出,重试实现以某种方式得出结论,可重试方法成功,但我无法理解原因。我在网上找不到关于这个问题的答案可供参考;我希望其他人知道 save() 方法是否与 Retryable 注释不兼容,或者是否需要修复某些内容才能使其正常工作。
它对我有用。
Spring Boot 3.2.2.
使用了以下两个注释:
@EnableAspectJAutoProxy(proxyTargetClass = true)`
@EnableRetry
以下@Retryable已应用于类级别或方法级别。要测试打开/关闭的 Postgres 数据库:
@Retryable(
retryFor = {CannotCreateTransactionException.class},
noRetryFor = {Exception.class},
maxAttempts = 6,
backoff = @Backoff(delay = 1000, multiplier = 2, maxDelay = 1800000),
listeners = {"retryLoggingListener"})
日志输出:
2024-01-18:07:02.986 [http-nio-60202-exec-1] - INFO base.retry.RetryLoggingListener - retry onError, count: 3, exception type:class org.springframework.transaction.CannotCreateTransactionException