1

Ich habe Feder JMS Message Listener-Container-Setup wie folgt.Spring JMS-Fehlerhandler ist nicht aufrufen

<beans:bean id="messageListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">  
      <beans:property name="connectionFactory" ref="amqConnectionFactory" /> 
      <beans:property name="destination" ref="request.Queue" /> 
      <beans:property name="messageListener" ref="messageListener" /> 
      <beans:property name="sessionTransacted" value="true" />   
      <beans:property name="errorHandler" ref="inboundErrorHandler"/>    
     </beans:bean> 

<beans:bean id="inboundErrorHandler" class="com.test.exception.MDPErrorHandler" /> 

Listener-Code ist wie folgt ..

@Component 
public class MyMessageListener implements MessageListener { 

    private static final Log LOG = LogFactory.getLogger(MyMessageListener.class); 

    @Autowired 
    private MessageHandler handler; 

    /** 
    * @see MessageListener#onMessage(Message) 
    */ 
    @Override 
    public void onMessage(Message inMessage) { 

     try 
      { 
       if (inMessage instanceof TextMessage) { 
        TextMessage msg = (TextMessage) inMessage;      
        handler.processRequest(msg.getText());             
       } else { 
        LOG.error("Message of wrong type: " + inMessage.getClass().getName()); 
       } 

      } catch (Exception cause) { 
       LOG.error("Error while receiving message in MlaMessageListener.onMesage() ",cause); 
      } 
    } 

} 

mein Fehler-Handler wie folgt ..

public class MDPErrorHandler implements ErrorHandler { 
    /** 
    * @see org.springframework.util.ErrorHandler#handleError(java.lang.Throwable) 
    */ 
    @Override 
    public void handleError(Throwable t) { 
     LOG.warn("Inside MDPErrorHandler.handleError()*** "); 
     t.printStackTrace(); 
    } 
} 

Warum mein Fehler-Handler wird nicht automatisch im Falle einer Ausnahme Aufruf/Fehler tritt in messageListener.onMessage() auf?

Muss ich es manuell aufrufen?

Antwort

0

Sie müssen den Container nicht so konfigurieren.

Fügen Sie dem eingehenden Adapter einfach einen Fehlerkanal hinzu; Wenn eine Ausnahme im Hauptfluss (incomingUpdateChannel->) auftritt, wird eine ErrorMessage an den Fehlerkanal gesendet. Die Nutzlast dieser Nachricht ist eine MessagingException und Sie können die fehlgeschlagene Nachricht extrahieren, um zu versuchen, sie an Ihre Fehlerwarteschlange zu senden. Fügen Sie einfach einen Transformer (expression = "payload.failedMessage") hinzu, gefolgt von einem JMS Outbound Adapter. Wenn der Sendevorgang erfolgreich ist, wird die ursprüngliche Transaktion ausgeführt. Wenn der Fehlerkanalfluss eine Ausnahme auslöst, wird die ursprüngliche Nachricht zurückgesetzt.

+0

Vielen Dank für Ihre Antwort. Aber die Lösung, die Sie vorschlagen, ist die Arbeit für die Integration des Frühlings, denke ich. Was ich nicht in meiner Bewerbung verwendet habe. Ich benutze nur einfache Feder jms. Keine Federintegration. – Arajit