/ / Czy należy używać JmsTransactionManager podczas utrwalania z jednej kolejki JMS do innej kolejki JMS - integracja wiosenna, wiosenna jms

Czy należy używać JmsTransactionManager podczas utrwalania się z jednej kolejki JMS do innej kolejki JMS - integracja wiosenna, wiosenna jms

Wymaganie: Musimy pobrać wiadomość z kolejki JMS (opublikowanej przez inną aplikację) i zachować wiadomość w naszej kolejce JMS. Potrzebujesz, aby cały przepływ był transakcyjny, więc jeśli komunikat nie może zostać utrwalony w kolejnej kolejce JMS, komunikat otrzymany z kolejki JMS nie powinien zostać potwierdzony. Moja konfiguracja jest jak poniżej

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

Czy muszę użyć JmsTransactionManager w tym scenariuszu, czy powinienem być powyżej konfiguracji wystarczającej. Możemy obsługiwać zduplikowane wiadomości, więc uważam, że nie potrzebujemy transakcji XA.

Odpowiedzi:

2 dla odpowiedzi № 1

Na pewno potrzebujesz tutaj transakcji XA, ponieważ używasz kilku osobnych zasobów transakcyjnych. Nawet jeśli oba są JMS, nie oznacza to, że mogą współużytkować transakcję.

OTOH możesz wypróbować takie rozwiązanie ChainedTransactionManager i łańcuch drugi JmsTransactionManagers - jeden dla każdego zasobu JMS.

Więcej informacji znajduje się w Dave Syer artykuł.


0 dla odpowiedzi nr 2

Dopóki nie przejdziesz do innego wątku(kanał kolejki, moduł wykonujący zadanie) i oba komponenty korzystają z tej samej fabryki połączeń, operacja wychodząca będzie przebiegać w tej samej transakcji co przychodząca - podstawowa JmsTemplatew adapterze wychodzącym użyje tej samej sesji, w której kontener nasłuchiwania przekazał wiadomość.