【问题标题】:Task executor will not run next task immediately任务执行器不会立即运行下一个任务
【发布时间】:2014-09-11 20:39:03
【问题描述】:

我有以下配置,我试图同时处理最多 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"/>

【问题讨论】:

    标签: spring-integration


    【解决方案1】:

    问题在于您的“来电运行”政策;这意味着轮询线程运行您的一项任务(#6)并且在该任务完成之前不会再次轮询。

    您确实需要使用CallerBlocks 政策 - 我们是added one to Spring Integration in 3.0.3 and 4.0.1

    您需要将 TaskExecutor 连接为&lt;bean/&gt;;命名空间不支持自定义策略。

    编辑:

    创建JIRA Issue

    【讨论】:

    • 虽然有一个小问题,它会轮询下一个任务,但会一直保持到可用的胎面,是否有可能在胎面空闲后轮询下一个任务?我有一个正在轮询的优先级队列,所以我想在真正准备好执行时进行轮询。
    • 不是真的;您也许可以使用自定义触发器做某事,但我怀疑它是否能完全满足您的需求。
    • 但是,您可以在轮询器的&lt;advice-chain/&gt; 中添加Advice,并且如果执行器忙,则不要进行轮询。
    • 请参阅this answer 了解如何编写/配置建议。
    最近更新 更多