在Spring WebFlux响应式处理程序中发送JMS消息:它是否阻塞?

时间:2018-04-19 07:53:05

标签: spring reactive-programming spring-webflux

这是反应性处理的正确方法吗?我看到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());

2 个答案:

答案 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());