2016-11-08 4 views
1

Hintergrund:Frühling Integration DSL JmsMessageDrivenChannelAdapter unendlich Wiederholung auch nach der Fehlerbehandlungsverarbeitung

Wir haben einen Frühling Integration Adapter in Spring XML-Konfigurations geschrieben, wie unten gezeigt. Es funktioniert perfekt in allen Szenarien mit Fehlerbehandlung. Die Fehlerbehandlung besteht darin, die Fehlermeldung in eine Warteschlange zu schreiben. Jetzt müssen wir diese XML-Konfiguration zu DSL umwandeln, wir haben das mit dem folgenden Code geändert.

Problem:

Immer wenn ein Fehler innerhalb Kette ‚inputChannel‘ geschieht, wollten wir die Fehlerbehandlung eine Inspektion zu tun, und die Fehler schreiben Warteschlange auf Fehler und nicht die Payload wiederholen. Spring XML tut genau das, was benötigt wird, aber wenn wir es nach dem Platzieren der Fehlermeldung in die Fehlerwarteschlange in DSL ändern, wird die Nutzlast zurück in die Eingabewarteschlange geschrieben und die Fehlermeldung aus der Warteschlange verschwindet in einer Schleife, die niemals endet .

Analyse wir haben:

kein Fehler ist passiert, nachdem die Fehlermeldung Warteschlange und DSL-Adapter Config muss nicht als solches Verfahren etwas Fehler geschrieben.

Jede Hilfe/Richtung, um dies zu lösen, wird sehr geschätzt.

Arbeits Spring-XML-Adapter:

<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> 

Problematische Adapter in DSL:

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

Antwort

1

Es gibt einige Fragen:

  1. Sie zeigen nicht, wie Sie MessageDrivenChannelAdapter() verwenden, die .

  2. Sie sollten die DEBUG-Protokolle teilen, um zu demonstrieren, wie Nachrichten reisen sollten und wie nicht.

Wenn ich Sie wäre, würde ich das XML zu diesem Java DSL konvertieren:

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

Der wichtigste Punkt ist jmsContainer Bohne, wie es in der XML-Konfiguration ist.

Und achten Sie darauf, wie ich Jms.messageDrivenChannelAdapter() - von der IntegrationFlows.from() und ohne get() Anruf verwenden.

Wenn Sie diese MessageDrivenChannelAdapter() Methode verwenden wollen, muss es public und @Bean sein, sonst alle Interna des IntegrationComponentSpec werden nicht funktionieren, weil sie nach .get() Anruf verloren.

Verwandte Themen