Spring Integration 5.0 + Project Reactor:控制线程

时间:2018-03-26 16:18:19

标签: java spring spring-integration reactive-programming project-reactor

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,但没效果。

并且将ExecutorChannelPoller与执行程序一起添加到处理程序也无济于事。

1 个答案:

答案 0 :(得分:2)

这有一些技巧:

.channel(new FluxMessageChannel())
.channel(MessageChannels.executor(Executors.newCachedThreadPool()))
.handle(message -> LOG.info(" -> " + message.getPayload())))

FluxMessageChannel消费的消息将被另外ExecutorChannel消息支持。

我认为你所要求的就像是一个功能请求,可以使所提到的FluxMessageChannel可配置。并且可以在那里配置subscribeOn/publishOn等。

随意提出问题JIRA