【问题标题】:How to stop DefaultMessageListenerContainer retrying for queue connection?如何停止 DefaultMessageListenerContainer 重试队列连接?
【发布时间】:2013-09-01 12:30:43
【问题描述】:

我正在使用下面的 spring jms 在独立应用程序中加载 spring 应用程序(使用 spring 2.5 并且无法升级到 3.0)上下文

AbstractApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");

下面是我的 applicationContext.xml

<bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    <property name="connectionFactory" ref="connectionFactory"/>
    <property name="destinationName" value="destinationName"/>
    <property name="messageListener" ref="jmsMessageListener" />
    <property name="exceptionListener" ref="exceptionListener"/> 
</bean>

<bean id="jmsMessageListener" class="Listener"/>

<bean id="connectionFactory" class="com.ibm.mq.jms.MQQueueConnectionFactory">
            <property name="hostName" value="${hostName}"/>
            <property name="port" value="${port}"/>
            <property name="queueManager" value="${queueManager}"/>
            <property name="transportType" value="${transportType}"/>
            <property name="channel" value="${channel}"/> 
   </bean>
    <bean id = "exceptionListener" class="ExceptionListener">

   public class ExceptionListener implements ExceptionListener{
   @Override
public void onException(JMSException arg0) {
     System.out.println("Exception");

}
   }

现在,问题是默认情况下 DefaultMessageListenerContainer 尝试恢复与队列的连接,直到成功,我可以在日志文件中看到如下消息

INFO [jmsContainer-1] org.springframework.jms.listener.DefaultMessageListenerContainer - Could not refresh JMS Connection - retrying in 5000 ms: javax.jms.JMSException: MQJMS2005: failed to create MQQueueManager for 'hostName:queueManager'

但我的要求是,如果连接失败,我的应用程序上下文应该停止加载,我可以报告无法连接的错误并抛出 JMSException。

我尝试对 DMLC 使用 exceptionListener,但它的 onException 消息没有被触发。

如果我以某种方式覆盖 DMLC 的默认行为或在加载 spring 应用程序上下文时捕获异常,我想我可以解决这个问题。

任何人都可以建议我如何实现上述任何一项或是否有其他选择?

【问题讨论】:

    标签: java spring jms listener spring-jms


    【解决方案1】:

    将连接工厂和 JMS 模板放在单独的上下文中。加载该上下文并尝试将消息发送到(可能是虚拟的)队列。如果成功,则创建一个新的应用程序上下文,将小上下文作为父上下文(以便 bean 可以看到连接工厂)设置 configLocationsrefresh()

    【讨论】:

    • 谢谢 Gary。看起来这是一种解决方法。我研究了 spring 代码,发现 refreshConnectionUntilSuccessful() 方法根本不调用异常侦听器,而是继续重试连接。不明白为什么春天的人像这样构建它..:(
    • 异常处理器用于处理processing消息时的异常;它与连接到代理无关。作为替代方案,如果您想要那种控制,请使用 JmsTemplate.receive() 而不是使用侦听器容器。
    • 我的要求是我必须使用监听器。它只是 DMLC 实现的设计方式是它会一直尝试连接直到成功,而不是停止/失败,如果不能。
    猜你喜欢
    • 1970-01-01
    • 2023-03-30
    • 2016-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-01
    • 2014-05-25
    • 1970-01-01
    相关资源
    最近更新 更多