我有以下配置,我试图同时处理最多5个请求。 每个请求都需要很长的时间来处理。我注意到它开始处理5个很棒的任务,但当其中一个任务完成时,它不会立即执行另一个任务,实际上它正在等待所有5个任务完成,然后只启动接下来的5个任务。所以我得到了某种批处理行为。可能是我没有正确配置,请帮忙纠正这个。我想在线程处理完一个后立即开始下一个任务。
我可以增加队列容量,在这种情况下它确实启动了下一个任务但我只想在我准备处理消息时调用我的入站消息提供程序,而不是仅仅将其保存在任务执行程序队列中。
<int:inbound-channel-adapter ref="feeder" channel="in">
<int:poller fixed-rate="100">
</int:poller>
</int:inbound-channel-adapter>
<int:bridge input-channel="in" output-channel="out" />
<task:executor id="taskExecutor" pool-size="1-5" keep-alive="120"
queue-capacity="0" rejection-policy="CALLER_RUNS"/>
<int:channel id="out">
<int:dispatcher task-executor="taskExecutor"/>
</int:channel>
<int:service-activator input-channel="out" output-channel="replyChannel"
ref="processor" method="process"/>
答案 0 :(得分:1)
问题是你的来电者跑了&#39;政策;这意味着轮询线程运行您的任务之一(#6)并且不会再次轮询,直到该任务完成。
您确实需要使用CallerBlocks
政策 - 我们added one to Spring Integration in 3.0.3 and 4.0.1。
您需要将TaskExecutor连接为<bean/>
;命名空间不支持自定义策略。
编辑:
创建了JIRA Issue。