我们应该将单声道用于<T>非 IO 操作吗?



在响应式Java应用程序中使用Mono和仅仅使用ReturnType有什么好处/缺点吗?

如果你只是做数据验证,使用Mono是否有意义

为例:选项1

public Mono<String> createEmployee(String name, String dept, String age){
Employee e;
try {
e = new Employee(name, dept, age);
} catch ( ValidationException ve){
logger.error("Invalid inputs: ", ve);
return Mono.error(ve);
}
return DBUtils.createEmployee(e).flatMap(
e -> {
return Mono.just(e.getId());
}
);
}

选项2

public Mono<String> createEmployee(String name, String dept, String age){
return Mono.just(new Employee(name, dept, age))
.flatMap(e -> DBUtils.createEmployee(e))
.flatMap(e -> Mono.just(e.getId())
.onErrorResume(e -> Mono.just("Invalid Inputs"));
}

是否有这样的规则,如果没有IO操作不使用Mono?

如果你只是做数据验证,使用Mono是否有意义

不,除非验证可能以某种方式涉及阻塞操作(如将数据发送到服务器进行验证),在这种情况下,它是有意义的。在这里,虽然它看起来就像你在一个标准方法中处理一些逻辑,没有阻塞操作,如API调用。

然而,在你的例子中,你做的不仅仅是验证-看起来你实际上是将员工保存到数据库(我假设这就是DBUtils.createEmployee(e)所做的)-在这种情况下,使用Mono是完全有意义的,因为这是一个教科书用例(允许你采取传统的阻塞操作,而不是使其成为反应链的一部分。)

因此,假设以上是正确的,那么选项2确实有意义-但它当然可以根据两个特定的指导原则简化:

  • 使用flatMap()是没有意义的,除非你的操作实际上返回一个发布者-否则就使用map()代替;
  • 创建POJO,将其包装在Mono中然后映射它是没有意义的-只需将发布者作为链中的第一个元素开始即可。

所以比起你的选项2,最好是这样写:

return DBUtils.createEmployee(new Employee(name, dept, age))
.map(Employee::getId)
.onErrorResume(e -> Mono.just("Invalid Inputs"));

相关内容

  • 没有找到相关文章

最新更新