我们有一个应用程序,大约75个分区步骤分布在100个作业。我们对出站网关的配置是:
<int-jms:outbound-gateway
id="outbound-gateway_1"
auto-startup="true"
connection-factory="jmsConnectionFactory"
request-channel="jms.requests_1"
request-destination="jms.requestsQueue"
reply-channel="jms.reply_1"
reply-destination="jms.repliesQueue"
receive-timeout="${timeout}"
correlation-key="JMSCorrelationID" >
<int-jms:reply-listener receive-timeout="1000"/>
</int-jms:outbound-gateway>
当autostart =&#34; true&#34;我们看到每个出站网关的replyListener线程。为了消除这种额外的负载和资源消耗,我们将更改为autostart =&#34; false&#34;并为分区步骤添加了一个步骤监听器,在beforeStep和afterStep方法中启动和停止网关。在服务器启动时,replyListener线程不符合预期。它们在步骤执行期间出现,但在呼出停止在出站网关后(即使在等待很长一段时间后)也不会被删除。
还是需要其他东西来清理replyListener吗?
答案 0 :(得分:0)
while ((active = isActive()) && !isRunning()) {
if (interrupted) {
throw new IllegalStateException("Thread was interrupted while waiting for " +
"a restart of the listener container, but container is still stopped");
}
if (!wasWaiting) {
decreaseActiveInvokerCount();
}
wasWaiting = true;
try {
lifecycleMonitor.wait();
}
catch (InterruptedException ex) {
// Re-interrupt current thread, to allow other threads to react.
Thread.currentThread().interrupt();
interrupted = true;
}
}
DefaultMessageListenerContainer.AsyncMessageListenerInvoker.executeOngoingLoop()
中的
有lifecycleMonitor.wait();
点并注意IllegalStateException
的消息。
不确定这种设计的目的是什么,但除非按原样使用,否则我们没有选择。
此外start()
中的逻辑基于this.pausedTasks
本地缓存,如果容器doInitialize()
在!this.running
期间填充。
如果您认为逻辑必须以某种方式改变,请随意提出JIRA。