我正在使用如下弹簧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。
我尝试将exceptionListener用于DMLC,但是它的onException消息不会被触发。
我想如果我以某种方式覆盖DMLC的默认行为或者在加载spring应用程序上下文时捕获异常,我可以解决这个问题。
任何人都可以建议我如何实现上述任何一项或者是否有其他选择?
答案 0 :(得分:0)
将连接工厂和JMS模板放在单独的上下文中。加载该上下文并尝试将消息发送到(可能是虚拟的)队列。如果成功,则创建一个新的应用程序上下文,其中小上下文作为父上下文(因此bean可以看到连接工厂)设置configLocations
和refresh()
。