2015-07-28 64 views
1

我正在处理卡住的现有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:

是我的问题有关在发行中提到以下链接:

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

另外,我不清楚poller的receive-timeout属性。

+0

更改这些参数只会将瓶颈转移到其他地方。您甚至可能通过获取所有记录而逃脱。 – Geek

+0

那么,有没有解决这些问题的建议或最佳实践? –

+0

您可以尝试此配置的几个排列,但重点是问题可能在这些配置之外。除非你解决了实际问题,否则扼流装置可能会发生其他问题。 – Geek

回答

1

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

  1. hashcode和equals方法的HashMap的键没有被覆盖。散列表被用来缓存查询,但是在没有被覆盖的方法中它没有正常工作。

  2. 在Spring Integration代码中插入了大约20,000次插入记录的插入查询。因为,AFAIK我们不能在Spring集成中进行批量更新。所以,我将插入查询提取到java类中并进行批量更新。

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

非常感谢Geek和Gary帮助我。

2

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

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

如果你不能从线程转储中解决它,请将其发布到某处(不在这里 - 可能太大) - pastebin或github要点。