积分器频道无效后的队列频道

时间:2017-03-26 03:07:03

标签: spring spring-integration

我使用Spring Integration处理文件。这是我的配置

<int:channel id="startChannel">
<int:splitter input-channel="startChannel" output-channel="parseChannel" ref="splitter" method="split" />
<int:channel id="parseChannel">
    <int:queue size="50"/>
</int:channel>
<int:service-activator input-channel="parseChannel" output-channel="aggregatChannel" ref="process" method="process" />
 <int:channel id="aggregateChannel">  
     <int:queue size="50"/>
</int:channel>
<int:aggregate input-channel="aggregateChannel" output-channel="postProcessingChannel" ...(other attributes) />
<int:channel id="postProcessingChannel">  
     <int:queue size="50"/>
</int:channel>
<int:channel id="outboundChannel">  
     <int:queue size="50"/>
</int:channel>
<int:service-activator input-channel="postProcessingChannel" output-channel="outbound-channel" ... />
 <int:outbound-adapter channel="outputChannel" ... />

 ..global poller
 ..global taskexecutor of size 40

我的配置工作正常,直到聚合器。聚合器能够将消息放在postProcessingChannel,但没有人从postProcessing Channel读取消息。

仔细看,我观察 - 1)后处理通道充满了其容量的消息。 2)线程在聚合器实现中被阻塞,因为它们无法将消息放入postPostProcessing Channel。

我的问题是为什么没有线程从PostProcessingchannel读取?从JProfiler我可以看到,许多线程空闲/自由没有做任何事情。

有人可以帮我理解这种行为。

1 个答案:

答案 0 :(得分:0)

你有很多队列频道;通常没有必要使每个通道成为队列通道。

如果你有更多的配置,你可能在默认的taskScheduler bean中遇到线程饥饿 - 它默认只有10个线程。

如果您的应用程序中有近10个队列通道,则线程将用完,因为默认情况下,每个队列通道将阻塞一个线程1秒钟(receiveTimeout)。

考虑减少队列通道的数量(正如我所说,一般不需要这么多;你不需要交给每个组件之间的另一个线程。)

或者,请参阅Configuring the Task Scheduler以增加计划任务的可用线程。