Java 如何停止DefaultMessageListenerContainer重试队列连接?

Java 如何停止DefaultMessageListenerContainer重试队列连接?,java,spring,jms,listener,spring-jms,Java,Spring,Jms,Listener,Spring Jms,我正在使用SpringJMS在独立应用程序中加载spring应用程序(使用Spring2.5,无法升级到3.0)上下文,如下所示 AbstractApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); INFO [jmsContainer-1] org.springframework.jms.listener.DefaultMessageListe

我正在使用SpringJMS在独立应用程序中加载spring应用程序(使用Spring2.5,无法升级到3.0)上下文,如下所示

AbstractApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
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'
下面是我的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");

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

我尝试为DMLC使用exceptionListener,但它的OneException消息没有被触发

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


有人能建议我如何实现上述任何一项,或者是否有其他替代方案吗?

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

谢谢Gary。看起来这是一种解决方法。我深入研究了spring代码,发现RefreshConnectionUntilsuccess()方法根本不调用异常侦听器,而是不断尝试连接。无法理解为什么spring人员会这样构建它。(异常处理程序用于处理
处理
消息时的异常;它与连接到代理无关。或者,使用
JmsTemplate.receive()
如果您想要这种控制,请不要使用侦听器容器。我的要求是我必须使用侦听器。它的DMLC实现就是这样设计的,它会一直尝试连接,直到成功,而不是在无法连接时停止/失败。