JmsOutboundGateway:手动启动和停止

时间:2016-12-15 19:28:31

标签: spring-integration spring-batch spring-jms

我们有一个应用程序,大约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吗?

1 个答案:

答案 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