我正在处理卡住的现有Spring集成代码。弹簧集成 - 任务执行卡住
下面的代码越来越多了。大约20,000条记录从sql查询中提取并发送到分离器。
代码:
<int-jdbc:outbound-gateway query="..." />
<int:splitter input-channel="..." output-channel="queueChannel"/>
<int:channel id="queueChannel">
<int:queue capacity="25" />
</int:channel>
<int:service-activator ref="..."
input-channel="queueChannel" output-channel="..." method="xxx">
<int:poller max-messages-per-poll="25" fixed-delay="100"
receive-timeout="30000" task-executor="reqExecutor"/>
</int:service-activator>
<task:executor id="reqExecutor" pool-size="25" queue-capacity="5" rejection-policy="CALLER_RUNS" />
做一些网络上的搜索后,这里是我的代码的理解。请纠正我,如果我错了:
分离器输出通道是容量为25的队列通道,这意味着它将从查询中获取一批25条记录。
现在,写入服务激活器的代码将每隔100毫秒轮询一次,并从队列通道中获取25条消息。 Service Activator与任务执行器在多线程环境中运行。
任务执行程序的池大小为25.这就是一次可以运行的最大线程数。队列容量为5.如果所有线程都忙,Executor会将它们放入队列中。如果队列容量达到5,则执行程序将拒绝该任务。
拒收政策是CALLER_RUNS。执行者将使用拒绝的主进程。
应用程序性能可能会受到CALLER_RUNS拒绝策略的影响。但其他政策放弃或中止线程。所以,改变拒绝政策并不是一个解决方案。
要更改任务执行程序的池大小或队列容量来解决问题。有没有什么优先价值?它的影响是什么。
或者,我应该改变轮询的固定延迟?
编辑1:
在日志中,以下线反复来来往往的过程没有完成:
Received no Message during the poll, returning 'false'
编辑2:
是我的问题有关在发行中提到以下链接:
另外,我不清楚poller的receive-timeout属性。
更改这些参数只会将瓶颈转移到其他地方。您甚至可能通过获取所有记录而逃脱。 – Geek
那么,有没有解决这些问题的建议或最佳实践? –
您可以尝试此配置的几个排列,但重点是问题可能在这些配置之外。除非你解决了实际问题,否则扼流装置可能会发生其他问题。 – Geek