JmsOutboundGateway Error: No sender waiting for reply

JmsOutboundGateway Error: No sender waiting for reply

我们 运行 包含大约 80 个批处理作业的序列,其中一半以上分区最多 50 个分区。据我所知,我们做的唯一非标准的事情是禁用自动启动。网关的启动和停止由步骤侦听器管理。这在大多数时间都很好,但我们偶尔会看到失败。我增加了日志记录,并查看了所有与 correlationId 一起发送的消息。堆栈跟踪发生在远程分区结束后(在本例中...大约 3 分钟):

2016-01-19 22:19:01,517 DEBUG [org.springframework.integration.jms.JmsOutboundGateway] (springbatch.partitioned.jms.taskExecutor-38) policy.estimatepayroll.outbound-gateway Sending message with correlationId d1025dfd-3551-4df8-96a7-043364c52e3d_18


2016-01-19 22:21:55,240 WARN  [org.springframework.integration.jms.JmsOutboundGateway] (org.springframework.integration.jms.JmsOutboundGateway#0.replyListener-1) Failed to consume reply with correlationId d1025dfd-3551-4df8-96a7-043364c52e3d_18
    java.lang.RuntimeException: No sender waiting for reply
        at org.springframework.integration.jms.JmsOutboundGateway.onMessage(JmsOutboundGateway.java:945)
        at org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:562)
        at org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:500)
        at org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:468)
        at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:326)
        at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:264)
        at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1069)
        at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1061)
        at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:958)
        at java.lang.Thread.run(Unknown Source)

问题是,发生这种情况时,onMessage() 方法会抛出一个 RuntimeException,从而终止线程。后续作业使用的线程较少,因此一些分区以串行而不是并行的方式执行。

我查看了代码,但找不到这个问题是怎么发生的?难道是因为回复是一个 HashMap 而不是线程安全的?

感谢您的帮助/建议。

最可能的原因是 receive-timeout 太低 - 因此发送线程超时,不再等待回复。

默认超时时间很短(5 秒)。

编辑

抱歉,忘记了这是最近修复的(在 4.2 和 4.1 中)。

我们已经 back-ported 但尚未发布带有修复程序的 4.0.x 或 3.0.x。

JIRA Here.