You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何结合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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 22:38:20