Spring Integration Aggregator是单线程执行

时间:2018-04-22 19:45:16

标签: spring multithreading spring-integration

我在我的应用程序中使用splitter聚合器模式。 我有以下配置 -

<int:splitter inputChannel="CH1" outputChannel="CH2" ref="foo" method="bar"/>
<int:aggregator inputChannel="CH2" outputChannel="CH3" ref="oof" method="rab" ---other required configurations/>
<task:scheduler --with threadpool of size 30 />
<!--there are other channels as well. Some are queue and some are direct channels-->

我的所有频道(CH1,CH2,CH3)都是QueueChannel。 Splitter输入通道CH1的源是一个文件。

在我的测试中,我观察到即使在CH1通道中添加两个文件,在给定时间只处理1个文件。所以我在CH1频道添加了一个Poller,现在CH1频道上的多个输入消息会被同时处理。

在聚合器方面,我观察到执行始终是单线程的,即直到第一个线程完成执行,第二个线程才开始执行。

到目前为止我尝试过解决这个问题 -

  1. 将轮询器添加到<int:aggregate> config
  2. 将轮询器添加到输入通道CH2(输入到聚合器)
  3. 将调度程序添加到输入通道CH2
  4. 有人可以帮助我使聚合器处理多线程。

    UPDATE1 我想做什么:

    我收到包含库存数据的文件。我为每个文件创建消息并将其放在CH1通道中。 CH1通道有一个分离器,它将它分成单独的记录并发送到CH2通道。 CH2通道有一个与之关联的聚合器,它将尝试根据文件名聚合记录,'oof.rab'将记录写入数据库。我的期望是看到同一个文件的多个批次同时写入数据库。

    UPDATE2: 聚合在这里完成批处理行,这样我们就可以批量模式将其写入数据库而不是单独写行

1 个答案:

答案 0 :(得分:0)

聚合器是多线程的,但仅适用于不同的消息组(相关性)。每个组都必须是单线程的,因为对于每个消息到达,我们必须咨询ReleaseStrategy。