我使用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我可以看到,许多线程空闲/自由没有做任何事情。
有人可以帮我理解这种行为。
答案 0 :(得分:0)
你有很多队列频道;通常没有必要使每个通道成为队列通道。
如果你有更多的配置,你可能在默认的taskScheduler
bean中遇到线程饥饿 - 它默认只有10个线程。
如果您的应用程序中有近10个队列通道,则线程将用完,因为默认情况下,每个队列通道将阻塞一个线程1秒钟(receiveTimeout
)。
考虑减少队列通道的数量(正如我所说,一般不需要这么多;你不需要交给每个组件之间的另一个线程。)
或者,请参阅Configuring the Task Scheduler以增加计划任务的可用线程。