Aby uprościć mój problem, mamWiosna/RabbitMQ: zarządzanie transakcjami
app1 z metodą @Transactionnal createuser():
- Włóż nowy użytkownik w bazie
- Dodaj wiadomość asynchronicznej w RabbitMQ aby użytkownik otrzymał wiadomość e-mail z powiadomieniem
- (potencjalnie z dodatkowym kodem, ale niewiele)
Apl2 z komunikatem RabbitMQ consummer
- wiadomości Consummes w kolejce do korespondencji w czasie rzeczywistym
- dane Przeczytaj mail w bazie danych
Problem polega na tym, że czasami App2 próbuje skonsumować wiadomość RabbitMQ zanim transakcja zostanie zatwierdzona w App1. Oznacza to, że App2 nie może odczytać danych poczty w bazie danych, ponieważ użytkownik nie został jeszcze utworzony.
Niektóre rozwiązania mogą być:
-
poziom izolacji
- Zastosowanie READ_UNCOMMITED na App2
- Dodaj pewne opóźnienie w RabbitMQ wiadomości pocztowe (lub jakiś RetryTemplate na consummer)
- zmienić sposób wysyłania wiadomości e-mail ...
Widziałem, że na wiosnę jest RabbitTransactionManager, ale nie mogę zrozumieć, jak to powinno wyglądać ork. Wewnętrzne aspekty obsługi transakcji zawsze wydawały się nieco trudne do zrozumienia, a dokumentacja również nie pomaga tak bardzo.
Czy istnieje sposób na zrobienie czegoś takiego?
- Dodaj wiadomość do kolejki RabbitMQ w @Transactionnal metody
- Po zakończeniu transakcji, wiadomość jest przyznaniem się do kolejki, a zmiany są zaangażowani w bazie
- Tak, że wiadomość nie można skonsumować przed zakończeniem transakcji db
Jak? I czego się spodziewać na przykład, jeśli wyślę synchroniczne wiadomości RabbitMQ zamiast wiadomości asynchronicznych? Czy zablokuje wątek czekający na odpowiedź, czy coś takiego? Ponieważ wysyłamy wiadomości synchronizacji i asynchroniczne dla różnych zastosowań.
mam rację, że obie aplikacje zużywają wiadomości z tej samej kolejki? – pinepain
Nie, Apl1 umieścić wiadomości w kolejce i Apl2 zużywa wiadomości w tej kolejce –
udało Ci się rozwiązać ten problem jakoś? Mam do czynienia z tym samym problemem. –