jms cachingconnectionfactory onexception方法从未在jmsexception上调用

oyxsuwqo  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(416)

我使用apachecamel和spring从java服务发送消息。我需要重置jms连接,以防在exchange发生任何错误。我使用下面的代码来实现我的目标。

try
{
    producerTemplate.sendBody(endPoint, bytes);
}
catch (final RuntimeCamelException exception)
{
    LOGGER.error("Exception occured in sendBody", exception.getMessage(), exception);
    handleError(); // handle error here.
}

在camel上下文中,我用exception listener定义了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}&amp;jms.password=${user.password}&amp;jms.redeliveryPolicy.maxRedeliveries=${message.retry.count}&amp;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块内进行,但从未调用singleconnectionfactory的onexception(),即使定义了exceptionlistener。其思想是调用resetconnection()(在onexception内部)来重置jms连接。

sqougxex

sqougxex1#

实施 ExceptionListener 并将异常侦听器定义作为属性添加到spring连接工厂 testCachingConnectionFactory .
例如,创建一个异常侦听器类(组件) JmsExceptionListener :

public class JmsExceptionListener implements ExceptionListener {    
    @Override
    public void onException(JMSException exception) {
        // what ever you wanna do here!
    }
}

然后为添加bean定义 JmsExceptionListener : <bean id="jmsExceptionListener" class="JmsExceptionListener"></bean> 然后将定义添加为异常侦听器属性: <property name="exceptionListener" ref="jmsExceptionListener"/> 而不是在配置中使用什么: <property name="exceptionListener" ref="testCachingConnectionFactory" />

相关问题