Spring Boot @Retryable 可以与 Spring Data JPA save() 方法一起使用吗?我的尝试重试一次然后假装成功

问题描述 投票:0回答:1

我正在尝试对扩展 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

}

我在控制台中得到的输出按以下顺序排列:

  1. 来自 retryListener 的“启动可重试方法”
  2. 带有查询和参数绑定信息的 Hibernate 调试日志
  3. SqlExceptionHelper 记录错误信息,例如数据将被截断
  4. 来自 retryListener 的“可重试方法抛出异常”
  5. 来自 retryListener 的“已完成可重试方法”
  6. 持续正常执行代码的日志;没有抛出异常

我已经使用 IntelliJ 调试器单步执行了,我可以看出,重试实现以某种方式得出结论,可重试方法成功,但我无法理解原因。我在网上找不到关于这个问题的答案可供参考;我希望其他人知道 save() 方法是否与 Retryable 注释不兼容,或者是否需要修复某些内容才能使其正常工作。

java spring-boot jpa spring-data-jpa spring-retry
1个回答
0
投票

它对我有用。

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
© www.soinside.com 2019 - 2024. All rights reserved.