gpt4 book ai didi

multithreading - Spring Integration - 任务执行器卡住了

转载 作者:行者123 更新时间:2023-12-03 12:55:24 24 4
gpt4 key购买 nike

我正在处理卡住的现有 Spring Integration 代码。

下面的代码被击中了。从 sql 查询中提取大约 20,000 条记录并发送到拆分器。

代码:

<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" />

在互联网上做了一些搜索后,这是我对代码的理解。请纠正我,如果我错了:

拆分器输出 channel 是容量为 25 的队列 channel ,这意味着它将从查询中获取一批 25 条记录。

现在,服务激活器中编写的代码将每 100 毫秒轮询一次,并从队列 channel 中获取 25 条消息。服务激活器与任务执行器一起运行在多线程环境中。

任务执行器的池大小为 25。这是一次可以运行的最大线程数。队列容量为 5。如果所有线程都忙,则 Executor 会将它们放入队列。如果队列容量达到 5,则执行器将拒绝该任务。

拒绝政策是 CALLER_RUNS。 Executor 将在拒绝时使用主进程。

应用程序性能可能会受到 CALLER_RUNS 拒绝策略的影响。但是其他策略会丢弃或中止线程。因此,更改拒绝政策不是解决方案。

我应该更改任务执行器的池大小或队列容量来解决问题吗?有没有优先值。会有什么影响。

或者,我应该更改轮询器的固定延迟吗?

编辑 1:

在日志中,下面一行重复出现并且进程未完成:

Received no Message during the poll, returning 'false'

编辑 2:

我的问题是否与以下链接中提到的问题有关:

http://docs.spring.io/autorepo/docs/spring-integration/3.0.x/reference/html/messaging-endpoints-chapter.html#async-polling

另外,我对poller的receive-timeout属性也不是很了解。

最佳答案

receive-timeout 是轮询器 (reqExecutor) 线程在队列 channel 中等待消息到达的时间。如果在没有消息到达后过期,则线程返回到池中。

如果有消息到达,它会在线程上进行处理,然后线程会返回到池中。

如果您无法从线程转储中解决问题,请将其发布到某处(不在这里 - 可能太大)- pastebin 或 github gist。

关于multithreading - Spring Integration - 任务执行器卡住了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31674419/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com