【问题标题】:how to cleanly shutdown high-concurrency Jms.messageDrivenChannelAdapter?如何干净地关闭高并发 Jms.messageDrivenChannelAdapter?
【发布时间】:2022-01-12 23:00:28
【问题描述】:

当我尝试关闭我的 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-message-driven-channel-adapter 并将确认设置为事务(默认)”,其中似乎暗示 jms 适配器默认是事务性的。
因此,我的主要问题是:即使我没有使用任何显式事务管理器,我是否不仅需要在我的容器上显式设置“receiveTimeout”,还需要使用 transactionTimeout > receiveTimeout 设置“transactionTimeout”?
非常感谢您的专业知识和时间。
最好的问候

【问题讨论】:

    标签: spring-integration spring-jms


    【解决方案1】:

    那不是“投掷”。这只是警告:

    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 Integration 使其 transacted 完全适合我们在该警告日志中看到的用例。

    【讨论】:

      猜你喜欢
      • 2014-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多