如何结合SmallRye Fault Tolerance @Retry与Mutiny Uni实现重试?
解决SmallRye Fault Tolerance @Retry与Mutiny Uni配合不生效的问题
要让SmallRye Fault Tolerance的@Retry注解与Mutiny Uni返回值配合生效,需完成以下两处关键修改:
1. 添加SmallRye Fault Tolerance的Mutiny集成依赖
SmallRye Fault Tolerance默认仅处理同步方法抛出的异常,无法直接感知Uni的异步失败信号。必须引入专门的Mutiny集成依赖,让FT能够订阅Uni并识别其失败事件。
以Maven为例,在pom.xml中添加:
<dependency> <groupId>io.smallrye</groupId> <artifactId>smallrye-fault-tolerance-mutiny</artifactId> <!-- 版本需与你当前使用的SmallRye Fault Tolerance版本匹配 --> <version>6.2.0</version> </dependency>
如果是Gradle项目,添加:
implementation 'io.smallrye:smallrye-fault-tolerance-mutiny:6.2.0'
2. 调整@Retry注解的异常处理配置
默认情况下,@Retry不会捕获Uni失败时包装的异步异常,需显式指定注解的applyOn和handle属性,覆盖默认规则:
@ApplicationScoped public class CakeBaker { // 配置重试5次,处理所有Throwable类型,包含异步调用异常 @Retry(maxRetries = 5, applyOn = Throwable.class, handle = AsyncInvocationException.class) public Uni<Long> bakeCake() { // 示例业务逻辑:随机返回失败的Uni if (Math.random() > 0.5) { return Uni.createFrom().failure(new RuntimeException("烘焙失败")); } return Uni.createFrom().item(System.currentTimeMillis()); } }
关键说明
applyOn = Throwable.class:指定触发重试的异常范围为所有可抛出类型handle = AsyncInvocationException.class:SmallRye FT会将Uni的失败包装为AsyncInvocationException,需明确处理该异常才能触发重试
完成修改后,当bakeCake返回失败的Uni时,@Retry会按配置触发5次重试(含首次执行共6次调用),与你之前使用Uni内置重试的行为一致。
内容的提问来源于stack exchange,提问作者BATMAN_2008
相关产品推荐
相关产品推荐

