2009-02-05 21 views
7

Mam proces, który obejmuje wysyłanie wiadomości JMS. Proces jest częścią transakcji. Jeśli późniejsza część transakcji nie powiedzie się, część, która jest po poprzedniej części, która wysłała wiadomość, muszę anulować wiadomość. Jedna myśl, jaką miałem, polegała na tym, że nie dało się jej odebrać przez pewien czas i jeśli potrzebuję wycofać, mógłbym odrzucić wiadomość. Brak znajomości wiadomości, nie wiem, czy pomysł jest możliwy. Czy istnieje lepszy pomysł? DziękiJMS rollback

Odpowiedz

7

Możesz używać JMS i JTA (Java Transaction API) razem - see here. W takim przypadku wysyłanie wiadomości JMS lub konsumpcja odebranej wiadomości faktycznie odbywa się atomowo jako część zatwierdzenia transakcji.

Co to oznacza? Jeśli transakcja nie powiedzie się lub zostanie wycofana, wiadomość "wysłana" nie zgaśnie, a wszelkie wiadomości "otrzymane" nie zostaną w rzeczywistości zużyte. Wszystko obsługiwane przez Twojego dostawcę JMS i JTA.

Musisz używać implementacji JMS obsługującej JTA. Wygląda na to, że już korzystasz z transakcji, więc może to być kwestia wykonania jakiejś konfiguracji, aby tak się stało (machając energicznie ręką ...).

Posiadam doświadczenie w tej dziedzinie (BEA WebLogic 7 w/BEA WebLogic Integration). Pracowałem jak w reklamie - "świat zewnętrzny" nie widział żadnego wpływu rzeczy JMS, których próbowałem, chyba że transakcja została pomyślnie zakończona.

8

Opisana przez ciebie transakcja XA. Dzięki temu transakcja może obejmować zakres wielu warstw, tj. Dostawcę JMS, bazę danych lub dowolny inny system EIS. Większość kontenerów można skonfigurować tak, aby korzystały zarówno z transakcji innych niż XA, jak i bez XA, więc sprawdź ustawienia kontenera!

Na przykład, jeśli używasz JMS z transakcjami XA, jest to możliwe.

Start Transaction 
     | 
    DB Insert 
     | 
    Send JMS Msg 
     | 
    More DB Inserts 
     | 
    Commit Transaction <- Only at this point will the database records be inserted and the JMS message sent. 

XA Transakcje są dostępne tylko w pełnych kontenerach Java EE, więc transakcje XA nie są dostępne w Tomcat.

Powodzenia!

Karl

+0

uwzględniają również napowietrznych wydajności: http://stackoverflow.com/questions/12305900/performance-overhead-of-xa-data-sources-best-practices – Vadzim