这是反应性处理的正确方法吗?我看到2个线程,一个被动的nio,直到并包括flatMap(fareRepo::save)
。另一个线程是计算线程,它从发送消息开始,一直持续到ServerResponse.build()。我的问题是这种正确处理请求的方法吗?注意:fareRepo是反应型沙发基地回购。
感谢
return request.bodyToMono(Fare.class).flatMap(fareRepo::save).flatMap(fs -> {
logger.info("sending message: {}, to queue", fs.getId());
jmsTemplate.send("fare-request-queue", (session) -> session.createTextMessage(fs.getId()));
return Mono.just(fs);
}).flatMap(fi -> ServerResponse.created(URI.create("/fare/" + fi.getId())).build());
答案 0 :(得分:3)
我假设您正在使用Spring Framework的JmsTemplate
实施,这是阻止。
如果没有更多上下文,我们只能假设您在被动操作符的中间有阻塞操作,这会导致应用程序出现问题。
答案 1 :(得分:0)
Spring JmsTemplate将阻止您的请求线程,这不利于响应式设计编码。您可以尝试使用 .publishOn(Schedulers.elastic()),它将创建新线程并执行代码而不会阻塞请求线程。由于它是I / O绑定操作,因此请使用Schedulers.elastic()
return request.bodyToMono(Fare.class).flatMap(fareRepo::save)
.publishOn(Schedulers.elastic())
.flatMap(fs -> {
logger.info("sending message: {}, to queue", fs.getId());
jmsTemplate.send("fare-request-queue", (session) -> session.createTextMessage(fs.getId()));
return Mono.just(fs);
}).flatMap(fi -> ServerResponse.created(URI.create("/fare/" + fi.getId())).build());