我正在尝试使用流口水来探索响应式编程。我正在做 POC 以在对象上应用流口水规则。
public Mono<Order> findByOrderNo(String orderNo) {
Mono<Order> order = orderDAO.findByOrderNo ( orderNo );
KieSession kieSession = kieContainer.newKieSession("rulesSessionpart2");
kieSession.insert(order); // rules are not getting applied as it requires the object type
//as input
kieSession.fireAllRules();
kieSession.dispose();
return order;
}
这是我的测试规则:
import com.reactive.practice.springreactor.model.Order
rule "ReturnEligible for Order"
when
orderObject: Order(itemReturnEligible==true)
then
orderObject.setDescription("bdfgdfdfhdf");
end
在这里,方法kieSession.insert(order(需要一个对象作为输入,但在上面的代码中,我传递的是Mono的发布者类型。
我尝试使用 block(( 将单声道转换为订单对象。正如许多文档所建议的那样,不建议使用它,因为它会阻止操作。
有没有其他方法可以将单声道转换为订单对象。
任何帮助都是可观的。 谢谢
两个答案
1( 使用专用的测试库,如反应堆测试
https://projectreactor.io/docs/core/release/reference/#testing
StepVerifier.create(
appendBoomError(source))
.expectNext("thing1")
.expectNext("thing2")
.expectErrorMessage("boom")
.verify();
2(在测试中调用块不是问题。
如果您的单元测试方法正在阻塞并且必须在返回之前完成,那么阻止可以说是正确的调用。但是仍然有更好的方法可以做到这一点,就像上面的StepVerifier一样。
在响应式编程中,在生产代码中调用块几乎总是一个错误,除非您是阻塞上下文中的框架代码(例如运行进程的同步 servlet API(。 通常,您返回 Mono 并转换其他输入,而无需阻塞调用。