Post Page Rank

Podczas implementowania pewnego rozwiązania, w projekcie, przy którym
obecnie pracuje napotkałem na pewien problem. Sytuacja wyglądała
następująco:

  • 1. odbierałem obiekt
  • 2. zapisywałem ten obiekt do bazy
  • 3. identyfikator zapisanego rekordu wysyłałem do kolejki JMS.
  • 4. Inny komponent odbierał komunikat JMS i na podstawie
    zawartego w nim identyfikatora odczytywał zapisany w pkt. 2 rekord w
    celu dalszego przetwarzania

Operacje 1-3 wykonywane były w jednej, rozproszonej transakcji
(XA). Dla części komunikatów występowała sytuacja, że odczyt z pkt. 4
nie zwracał danych (czyli pomimo tego, że w kolejce znalazł się
identyfikator, w bazie nie istaniał jeszcze odpowiedni rekord).

Podejrzenie: komunikat JMS wysyłany był zanim nastąpiło
zatwierdzenie zaapisu w bazie danych.

Po zapoznaniu się ze specyfikacją JTA, podejrzenie okazało się
słuszne. Specyfikacja JTA nie określa kolejności zatwierdzania.

Czy istniało jakieś proste wyjście z tej sytuacji, nie wymagające
znaczącego nakładu pracy, tudzież zmiany projektu? Okazało się, że tak.
Serwer aplikacyjny Glassfish (innym serwerem, który działa w ten sam
sposób jest Weblogic), na którym miała pracować aplikacja, wykonuje
zatwierdzanie w tej kolejności, w jakiej utworzone zostaną zasoby. W
moim przypadku należało w pierwszej kolejności utworzyć połączenie do
bazy danych, a następnie połączenie do kolejki JMS.

Rozwiązanie to ma jeden zasadniczy minus – zależy od konkretnej
implementacji specyfikacji, co powoduje nieprzewidywalność działania na
innych platformach. Natomiast w moim konkretnym przypadku, nie stanowiło
to problemu i rozwiązanie to zostało przyjęte z pełną świadomością.

Pozostaw odpowiedź