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

Mutiny中对应Project Reactor Mono.fromCallable()的方法是什么

Mutiny中对应Mono.fromCallable()的Uni创建方法

对于熟悉Project Reactor的开发者,Mutiny中与Mono.fromCallable()功能、语义完全对等的方法是Uni.createFrom().item(),支持直接传入Callable实例或匿名Lambda表达式创建Uni,行为完全对齐:

  • 懒执行:仅当有订阅者订阅该Uni时,才会触发传入的Callable/Lambda逻辑,不会在创建实例时提前执行
  • 异常自动捕获:Callable执行过程中抛出的所有异常(包含受检异常)都会被自动封装为失败信号向下游传递,无需手动做异常包装
  • 空值兼容:Callable返回null时会正常发出空值信号,和Mono.fromCallable()的空值处理逻辑一致(注意和直接传入固定值的Uni.createFrom().item(T value)重载区分,该重载不接收null值)

代码对照示例

Reactor 原写法

Mono<User> userMono = Mono.fromCallable(() -> {
    // 自定义同步业务逻辑,允许抛出受检异常
    return userRepository.queryById(1L);
});

Mutiny 对等写法

Uni<User> userUni = Uni.createFrom().item(() -> {
    // 业务逻辑无需调整,和Reactor写法完全一致
    return userRepository.queryById(1L);
});

额外注意事项

如果传入的Callable包含阻塞IO/阻塞计算逻辑,和Reactor的使用规范一致,需要指定执行该逻辑的线程池,避免阻塞事件循环线程,示例:

Uni<User> blockingUserUni = Uni.createFrom()
        .item(() -> blockingUserRepository.queryById(1L)) // 阻塞逻辑
        .runSubscriptionOn(Infrastructure.getDefaultWorkerPool()); // 指定运行在阻塞工作线程池

补充:不要和Uni.createFrom().deferred()混淆,该方法对等的是Reactor的Mono.defer(),用于在订阅时动态返回另一个Uni实例,而非直接执行同步逻辑返回结果值。

内容的提问来源于stack exchange,提问作者macnixde

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 03:21:45