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
相关产品推荐
相关产品推荐

