首页 > 解决方案 > 如何使 Failsafe RetryPolicy 处理 ConstraintVoilationException

问题描述

我试图通过读取来自每次通过单独线程触发的活动 mq 的消息来在表上插入和更新。有时插入查询会因为 ConstraintVoilationException 而失败。我想重试,因为代码会将重试尝试视为更新,并且不会出现 ConstraintVoilationException。

但是,RetryPolicy 并未处理此异常。我该如何定制它?

故障保护神器版本:net.jodah (2.3.3)

这是代码示例,其中“T”是我的实体的类名。

@Transactional
processTxn(T t){
 RetryPolicy<T> rp =  RetryPolicy<T>.handle(ConstraintVoilationException.class).withMaxRetries(3);
 Failsafe.with(rp).run(() -> insertOrUpdateMethod(t));
}

@Transactional
insertOrUpdateMethod (T t){
 //Fetch instance of t from DB, if it exists - fire update on a few columns
 //else insert a new row
}

我也用 DataIntegrityVoilationException 和 SQLIntegrityConstraintVoilationException 尝试了这段代码,但代码在失败后不会重试。

标签: javaspring-boothibernateretrypolicy

解决方案


推荐阅读