https://stackoverflow.com/a/47136941/1776585
的后续问题在使用Flux
+ split()
+ FluxMessageChannel
时,我无法让我的集成处理程序在并行线程中运行。
请考虑以下代码段:
// ...
.handle(message -> Flux.range(0, 10)
.doOnNext(i -> LOG.info("> " + i))
.subscribeOn(Schedulers.parallel()))
.split()
.channel(new FluxMessageChannel())
.handle(message -> LOG.info(" -> " + message.getPayload())))
// ...
所有日志都在一个线程中输出:
[ parallel-1] d.a.Application : > 0
[ parallel-1] d.a.Application : -> 0
[ parallel-1] d.a.Application : > 1
[ parallel-1] d.a.Application : -> 1
[ parallel-1] d.a.Application : > 2
[ parallel-1] d.a.Application : -> 2
[ parallel-1] d.a.Application : > 3
[ parallel-1] d.a.Application : -> 3
[ parallel-1] d.a.Application : > 4
[ parallel-1] d.a.Application : -> 4
[ parallel-1] d.a.Application : > 5
[ parallel-1] d.a.Application : -> 5
[ parallel-1] d.a.Application : > 6
[ parallel-1] d.a.Application : -> 6
[ parallel-1] d.a.Application : > 7
[ parallel-1] d.a.Application : -> 7
[ parallel-1] d.a.Application : > 8
[ parallel-1] d.a.Application : -> 8
[ parallel-1] d.a.Application : > 9
[ parallel-1] d.a.Application : -> 9
如何在多个线程中强制处理?
我尝试在.parallel().runOn()
上使用Flux
,但这只会使数据并行,但实际处理仍在一个线程上运行。
我还在.publishOn(Schedulers.parallel())
上尝试了Flux
,但没效果。
并且将ExecutorChannel
或Poller
与执行程序一起添加到处理程序也无济于事。
答案 0 :(得分:2)
这有一些技巧:
.channel(new FluxMessageChannel())
.channel(MessageChannels.executor(Executors.newCachedThreadPool()))
.handle(message -> LOG.info(" -> " + message.getPayload())))
FluxMessageChannel
消费的消息将被另外ExecutorChannel
消息支持。
我认为你所要求的就像是一个功能请求,可以使所提到的FluxMessageChannel
可配置。并且可以在那里配置subscribeOn/publishOn
等。
随意提出问题JIRA!