2017-02-24 4 views
0

Anforderung: Wir müssen eine Nachricht von einer JMS-Warteschlange abrufen (von einer anderen Anwendung veröffentlicht) und die Nachricht in unserer JMS-Warteschlange beibehalten. Wenn der gesamte Datenfluss als Transaktion ausgeführt werden soll, sollte die Nachricht, die von der vorgelagerten JMS-Warteschlange empfangen wird, nicht bestätigt werden, wenn eine Nachricht in der nachgelagerten JMS-Warteschlange nicht beibehalten werden kann. Meine Konfiguration ist als untenSoll JmsTransactionManager verwendet werden, wenn von einer JMS-Queue zu einer anderen JMS-Queue bleiben soll

<int-jms:message-driven-channel-adapter 
    id="MessageDrivenAdapter" channel=" jmsMessageChannel " destination="sourceDestination" 
    connectionFactory="CF1" 
acknowledge="transacted" 
    /> 

<int:channel id=" jmsMessageChannel " /> 
<int-jms:outbound-channel-adapter id="sendsomemsg" 
    channel=" jmsMessageChannel " destination=”finalDestination” 
    connectionFactory="CF2" 
    session-transacted="true" /> 

Muss ich JmsTransactionManager in diesem Szenario verwenden oder über Konfiguration ausreichen sollte. Wir können doppelte Nachrichten verarbeiten, daher glaube ich, dass wir keine XA-Transaktion benötigen.

Antwort

2

Sie benötigen unbedingt XA-Transaktion hier, weil Sie mehrere separate Transaktionsressourcen verwenden. Selbst wenn sie beide JMS sind, bedeutet das nicht, dass sie Transaktionen teilen können.

OTOH können Sie versuchen, eine Lösung wie ChainedTransactionManager und Kette zwei JmsTransactionManager s - eine für jede Ihre JMS-Ressource.

Weitere Informationen finden Sie in Dave Syers article.

+0

Diese Komponenten verwenden dieselbe Verbindungsfactory. –

+0

Die Verbindungsfabriken sind anders. Habe den Code bearbeitet. So glaube ich, muss JmsTransactionManager verwenden – vjm

+0

Nein, Sie benötigen 'JtaTransactionManager' oder eine andere XA-Implementierung, wenn Sie' ChainedTransactionManager' kompliziert finden. Der gemeinsame 'JmsTransactionManager' funktioniert nicht für Ihren Fall. –

0

Solange Sie nicht an einen anderen Thread übergeben (Warteschlangenkanal, Task Executor) und beide Komponenten dieselbe Verbindungsfactory verwenden, wird der ausgehende Vorgang in der gleichen Transaktion ausgeführt wie der eingehende - der zugrunde liegende JmsTemplate Im ausgehenden Adapter wird dieselbe Sitzung verwendet, in der der Listener-Container die Nachricht gesendet hat.

+0

Die Verbindungsfabriken sind anders. Habe den Code bearbeitet. Also glaube ich muss JmsTransactionManager verwenden – vjm

Verwandte Themen