请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于WebFlux

老师,如果这个WebFlux返回自定义格式的请求,有什么方式吗,我这边封装的Flux,会阻塞到线程,感觉会导致webflux失去了意义,这个要如何处理呢

正在回答 回答被采纳积分+3

1回答

Zachry_Zhang 2021-12-23 22:31:43

嗨不好意思,昨天有事儿回复的晚了些。你的提问感觉是两个问题:
1. 如果WebFlux返回自定义格式的请求该如何定义? 可以直接将需要返回的T类包装在Mono<T>或者Flux<T>中返回,spring-webflux 会根据配置的HttpMessageConverter来进行Java Object <--> JSON格式的转换(亦可自行添加自定义的codec)
2. 封装的Flux会阻塞到线程,如何处理? 如果在reactive pipeline的调用过程中遇到了线程阻塞,那么reactor会报错;常用的做法是通过定义publishOn指定另外的线程池调用阻塞方法,或对阻塞的方法进行包装/重写。如果调用block()导致阻塞的原因是因为要提取其中的元素进行处理,可以考虑不提取直接返回Mono/Flux然后使用合适的操作符进行操作,并统一在pipeline结尾subscribe触发调用。如果对实现的细节还有问题的话,可以把代码贴出来我们一起看一下。

0 回复 有任何疑惑可以回复我~
  • 提问者 qq_慕莱坞4316410 #1
    老师,还有就是mvc的异步调用,方法睡眠导致线程阻塞,mvc异步请求效果很快,但是我换成WebFlux之后,调用都是在一个线程上面,导致webflux请求时间和mvc的请求时间一样了,我调用的是jsut方法,老师为什么会没有效果出现了
    回复 有任何疑惑可以回复我~ 2021-12-24 08:51:22
  • 异步调用中不应该使用sleep,如果需要等待async执行返回结果,应该使用CompletableFuture.join()或者isDone()去判断当前的async task是否执行完毕。
    
    关于请求时间的问题,即使是MVC异步,也是在异步线程上完成后才能返回结果,所以仅针对单次调用来比较时间没什么价值,甚至webflux可能会耗时更长(reactor 框架的开销会更大),更多时候我们需要从多并发场景下的吞吐量/资源消耗等多方面去衡量;此外也要看你的程序是IO密集还是计算密集,通常来说IO密集更能体现webflux这类响应式编程框架的优势。
    回复 有任何疑惑可以回复我~ 2021-12-24 12:25:13
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信