2017-10-31 8 views
0

aufgerufen Ich verwende Apache Camel mit Spring, um Nachrichten von meinem Java-Dienst zu senden. Ich muss zurücksetzen JMS-Verbindung im Falle eines Fehlers beim Austausch aufgetreten. Ich verwende den folgenden Code, um mein Ziel zu erreichen.JMS CachingConnectionFactory onException-Methode wird niemals bei JMSException

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

In Kamel Zusammenhang I CachingConnectionFactory mit Ausnahme Hörer und machte 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> 

In meinem Fall JMSSecurityException geworfen von Try-Block unterhalb Linie

definiert haben
producerTemplate.sendBody(endPoint, bytes) 

Ausführung geht in Catch-Block, aber OnException () von SingleConnectionFactory wird nie aufgerufen, obwohl exceptionListener definiert ist. Die Idee ist, resetConnection() (innerhalb OnException) aufzurufen, um die JMS-Verbindung zurückzusetzen.

Antwort

1

Implementieren Sie ExceptionListener und fügen Sie die Ausnahme-Listener-Definition als eine Eigenschaft zu Ihrer Spring Connection Factory testCachingConnectionFactory hinzu.

Zum Beispiel einer Ausnahme-Listener-Klasse erstellen (Komponente) JmsExceptionListener:

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

Dann für JmsExceptionListener eine Bohne Definition hinzufügen:

<bean id="jmsExceptionListener" class="JmsExceptionListener"></bean>

Und dann die Definition als Ausnahme-Listener hinzufügen Eigentum:

statt, was Sie in Ihrer Konfiguration verwenden:

<property name="exceptionListener" ref="testCachingConnectionFactory" />

+0

CachingConnectionFactory der Elternklasse SingleConnectionFactory selbst Exception implementiert ... so brauchen wir keine eigene Klasse zu erstellen. –

Verwandte Themen