1

私は春のJMSメッセージリスナコンテナの設定を次のようにしています。次のようにspring JMSエラーハンドラが呼び出されていません

次のようにリスナーのコードがある
<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" /> 

..

@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); 
      } 
    } 

} 

私のエラーハンドラは..です

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(); 
    } 
} 

なぜエラーハンドラは/任意の例外の場合には、自動的に起動されていませんmessageListener.onMessage()にエラーが発生しましたか?

手動で呼び出す必要はありますか?

答えて

0

このようなコンテナを設定する必要はありません。

受信アダプターにerror-channelを追加するだけです。メインフロー(incomingUpdateChannel->)で例外が発生すると、ErrorMessageがエラーチャネルに送信されます。そのメッセージのペイロードはMessagingExceptionになり、失敗したメッセージを抽出して失敗キューに送信しようとすることができます。変圧器(expresssion = "payload.failedMessage")の後にjms送信アダプターを追加してください。送信が成功した場合、元のトランザクションはコミットされます。エラーチャネルフローが例外をスローした場合、元のメッセージはロールバックされます。

+0

ご返信ありがとうございます。しかし、あなたが提案している解決策は、私が推測するバネ統合のための作業です。私は私のアプリケーションで使っていない。私はプレーンなスプリングジャムだけを使用しています。スプリング統合なし。 – Arajit

関連する問題