如何干净关闭高并发Jms.messageDrivenChannelAdapter?

how to cleanly shutdown high-concurrency Jms.messageDrivenChannelAdapter?

当我尝试关闭我的 spring 集成进程时,使用入站 Jms.messageDrivenChannelAdapter 的流程抛出以下错误消息:

"org.springframework.jms.listener.DefaultMessageListenerContainer - 由于侦听器容器在此期间被停止而拒绝接收到的消息"

我的入站适配器定义如下:

Jms.messageDrivenChannelAdapter(
    Jms.container(jmsConnectionFactory, destinationName)
    .concurrency(highConcurrency)
    .get()
    )

我认为我的问题是我的 jms 容器上的默认“receiveTimeout”太小,我需要增加该值以满足我的“高并发”(对吗?),如“receiveTimeout”似乎是容器“doShutdown”方法关心的唯一值。 现在,receiveTimeout 属性 的源代码说“这个值需要小于事务超时”。此外,关于入站 jms 适配器的 spring-integration doco 说“如果您希望整个流程都是事务性的 [...] )",这似乎暗示 jms 适配器默认是事务性的。
因此,我的主要问题是:即使我没有使用任何明确的事务管理器,我是否不仅需要在我的容器上明确设置“receiveTimeout”,还需要使用 transactionTimeout > receiveTimeout 明确设置“transactionTimeout”?
非常感谢您的专业知识和时间。
最好的问候

那不是“扔”。那只是警告:

protected void doExecuteListener(Session session, Message message) throws JMSException {
    if (!isAcceptMessagesWhileStopping() && !isRunning()) {
        if (logger.isWarnEnabled()) {
            logger.warn("Rejecting received message because of the listener container " +
                    "having been stopped in the meantime: " + message);
        }
        rollbackIfNecessary(session);
        throw new MessageRejectedWhileStoppingException();
    }

并注意 rollbackIfNecessary(session);。因此,即使接收到的消息以某种方式进入此侦听器函数,整个环境也会确保状态不会被破坏并且数据不会丢失 - 会话会回滚。

如果不使用 transactionManagertransactionTimeout 就没有意义。 Spring 集成使其 transacted 完全符合我们在该警告日志中看到的用例。