当前位置: 首页 > 知识库问答 >
问题:

Spring集成-任务执行器卡住了

严琨
2023-03-14

我正在开发一个现有的Spring集成代码,该代码被卡住了。

代码:

<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条记录。

现在,service activator中编写的代码将每100毫秒轮询一次,并从队列通道中获取25条消息。Service Activator与task executor一起在多线程环境中运行。

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

拒绝策略是CALLER\u RUNS。执行人将在拒绝时使用主流程。

应用程序性能可能会受到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

另外,我不清楚轮询器的接收超时属性。

共有2个答案

凤晨朗
2023-03-14

做了一些代码优化后就解决了。代码中有两个主要问题:

>

  • HashMap键的hashcode和equals方法没有被覆盖。hashmap用于缓存查询,但由于缺乏被覆盖的方法,它无法正常工作。

    在Spring集成代码中有一个插入查询,它插入记录大约20000次。因为,AFAIK我们不能在Spring集成中进行批量更新。所以,我将插入查询提取到java类中,并进行了批量更新。

    然而,我想知道,为什么线程转储和内存转储没有给出任何提示?

    感谢Geek和Gary帮我解决问题。

  • 云承天
    2023-03-14

    接收超时是轮询器(reqExecutor)线程在队列通道中等待消息到达的时间。如果在没有消息到达后过期,线程将返回到池。

    如果消息到达,它将在线程上处理,然后线程返回池。

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

     类似资料:
    • 我正在开发一个Spring集成应用程序。 我有一个入站通道适配器,用于读取目录,然后是一个拆分器,用于将文件拆分为行,最后是一个udp出站通道适配器,用于发送行 我想每秒钟发一封信 我可以通过定义自己的拆分器并在每次读取一行时等待1s来做到这一点,但我想知道是否可以在xml文件中尽可能简单地完成它。 提前谢谢

    • 我有一个队列通道和一个链,轮询器和任务执行器在该通道上“监听”,并行执行一些处理。我想做的是以这样一种方式配置它,我可以根据一些逻辑/属性路由特定消息,以确保特定消息“类型”始终由任务执行器的特定线程处理。 示例:消息,其中:

    • 我无法找到必要的信息,无论是在文档中还是在这里已经存在的问题中,这就是为什么我自己创建了一个(我还不能在类似的帖子下提问)。 我需要知道的是Spring任务执行器和调度器之间的关系。我当前的配置如下所示: 我不确定的是它是如何工作的。“谁”运行我的任务?是调度器,因为任务是和他一起安排的吗?或者调度器只是创建它们,放在队列中,由执行者运行它们? 如果没有,运行的是scheduler,我必须在特定类

    • 这是我的扑动医生总结 flutter doctor doctor摘要(要查看所有详细信息,请运行flutter Doctor-v):[√]flutter(通道稳定,1.22.3,Microsoft Windows[版本10.0.19041.572],区域设置en-KE)[√]Android toolchain-为Android设备开发(Android SDK版本30.0.2)[!]Android

    • 这是我的任务: 使用 Java™ NetBeans™ IDE 修改第二周的 Java™ 应用程序,以满足这些额外和更改的业务需求: - 该公司最近更改了其年度总薪酬政策以提高销售额 。 - 销售人员将继续获得 75,000 美元的固定工资。每个销售人员的当前销售目标是 140,000 美元。 - 只有当达到80%的销售目标时,销售激励才会开始。目前的佣金是总销售额的25%。 - 如果销售人员超过销

    • 我需要帮助。 我已经下载了Apache Flume并安装在Hadoop之外,只是想尝试通过控制台进行netcat日志记录。我使用1.6.0版本。 这是我的confhttps://gist.github.com/ans-4175/297e2b4fc0a67d826b4b 这是我是如何开始的 但是仅在打印这些输出后就卡住了 对于简单的启动和安装有什么建议吗? 谢谢