2016-11-08 5 views
1

背景:春の統合DSL JmsMessageDrivenChannelAdapter無限の再試行

私たちは、下図のように春のXML設定ファイルに記述された春の統合アダプタを持っています。エラー処理のすべてのシナリオで完璧に動作しています。すべてのことは、エラー処理はエラーメッセージをキューに書き込むことです。今度は、このXML設定をDSLに変換する必要があります。これを以下のコードを使用して変更しました。

問題:エラーが「inputChannel」チェーンの内部で起こるたび

、我々はいくつかの検査を行うと、キューをエラーにしてペイロードを再試行していないエラーを書き込むためにエラー処理を望んでいました。 Spring XMLは必要なことを正確に実行していますが、エラー・メッセージをエラー・キューに入れた後にDSLに変更すると、ペイロードが入力キューに書き戻され、キューからのエラー・メッセージが消えて終了しません。

分析は、我々はやった:

は、エラーメッセージがプロセスのようなものを持っていないキューおよびDSLアダプタの設定をエラーに書き込まれた後に起こってエラーがありません。

これを解決するための助力や方向性は非常に高く評価されています。

ワーキング春のXMLアダプタ:DSLで

<int-jms:message-driven-channel-adapter 
     channel="inputChannel" container="jmsContainer" extract-payload="true" /> 


<beans:bean id="jmsContainer"  class="org.springframework.jms.listener.DefaultMessageListenerContainer"> 
    <beans:property name="connectionFactory" ref="connectionFactory" /> 
    <beans:property name="destinationName" value="Queue.test" /> 
    <beans:property name="errorHandler" ref="errorHandler" /> 
</beans:bean> 

問題のあるアダプタ:

private JmsMessageDrivenChannelAdapter MessageDrivenChannelAdapter(
     String destinationName, String key) throws Exception { 
    JmsMessageDrivenChannelAdapter channelAdapter = Jms 
      .messageDriverChannelAdapter(connectionFactory) 
      .outputChannel(inputChannel) 
      .configureListenerContainer(
        c -> c.errorHandler(errorHandler)) 
      .destination(destinationName) 
      .setHeaderMapper(new HeaderMapper(getChannelHeaders(key))) 
      .get(); 
    return channelAdapter; 
} 

答えて

1

いくつかの質問があります。

  1. あなたはMessageDrivenChannelAdapter()ことをどのように使用するかを示していません。

  2. DEBUGログを共有して、メッセージの移動方法と配信方法をデモする必要があります。

私があなただったら、私はこのJava DSLにそのXMLを変換したい:

@Bean 
public DefaultMessageListenerContainer jmsContainer() { 
    DefaultMessageListenerContainer container = new DefaultMessageListenerContainer(); 
    container.setConnectionFactory(jmsConnectionFactory()); 
    container.setDestinationName("Queue.test"); 
    container.setErrorHandler(errorHandler); 
    return container; 
} 

@Bean 
public IntegrationFlow myJmsFlow() { 
    return IntegrationFlows.from(
      Jms.messageDrivenChannelAdapter(jmsContainer()) 
        .extractPayload(true)) 
      .channel(inputChannel) 
      .get(); 
} 

それはあなたのXML設定にあるようjmsContainer豆がある主なポイント。

Jms.messageDrivenChannelAdapter() - IntegrationFlows.from()からget()コールを使用する方法に注意してください。

あなたはそのMessageDrivenChannelAdapter()メソッドを使用しようとしている場合は、それ以外IntegrationComponentSpecのすべての内部は、それらが.get()呼び出し後に失われているので、仕事に行くされていない、public@Beanでなければなりません。