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 № 1Na 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 JmsTransactionManager
s - 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 JmsTemplate
w adapterze wychodzącym użyje tej samej sesji, w której kontener nasłuchiwania przekazał wiadomość.