我将Apache Camel与Spring一起使用,以从Java服务发送消息。如果交换时发生任何错误,我需要重置JMS连接。我正在使用下面的代码来实现我的目标。
try
{
producerTemplate.sendBody(endPoint, bytes);
}
catch (final RuntimeCamelException exception)
{
LOGGER.error("Exception occured in sendBody", exception.getMessage(), exception);
handleError(); // handle error here.
}
在骆驼上下文中,我已经定义了带有异常侦听器的CachingConnectionFactory,并使reconnectOnException = true
<bean id="testConnectionFactory" class="org.apache.qpid.jms.JmsConnectionFactory">
<property name="username" value="${user.name}" />
<property name="password" value="${user.password}" />
<property name="clientID" value="${host.address}" />
<property name="remoteURI"
value="amqp://${host.address}:${host.port}?jms.clientID=${host.address}?jms.username=${user.name}&jms.password=${user.password}&jms.redeliveryPolicy.maxRedeliveries=${message.retry.count}&amqp.saslMechanisms=PLAIN" />
</bean>
<bean id="testCachingConnectionFactory"
class="org.springframework.jms.connection.CachingConnectionFactory">
<property name="exceptionListener" ref="testCachingConnectionFactory" />
<property name="targetConnectionFactory" ref="testConnectionFactory" />
<property name="reconnectOnException" value="true" />
</bean>
就我而言,JMSSecurityException是从try代码块的下面一行抛出的
producerTemplate.sendBody(endPoint, bytes)
执行进入catch块内部,但是即使定义了exceptionListener,也不会调用SingleConnectionFactory的OnException()。这个想法是最终调用resetConnection()(在OnException内部)以重置JMS连接。
最佳答案
实现ExceptionListener
并将异常侦听器定义作为属性添加到您的spring连接工厂testCachingConnectionFactory
。
例如,创建一个异常侦听器类(组件)JmsExceptionListener
:
public class JmsExceptionListener implements ExceptionListener {
@Override
public void onException(JMSException exception) {
// what ever you wanna do here!
}
}
然后为
JmsExceptionListener
添加一个bean定义:<bean id="jmsExceptionListener" class="JmsExceptionListener"></bean>
然后将定义添加为异常侦听器属性:
<property name="exceptionListener" ref="jmsExceptionListener"/>
而不是您在配置中使用的是:
<property name="exceptionListener" ref="testCachingConnectionFactory" />