Już raz rozpoczynałem ten temat ale dalej mam kilka niepewności i chciałbym je rozwiać:

Mamy taką oto konstrukicje

                                                                |------------------|
                                   *                             |     --------       |
|--------|                      *                             |    | MDB |       |
|          |          |---------------------|              |     --------       |
|Servlet| ----> |         QUEUE        | ----->     |                      |
|          |          |---------------------|              |                       |
|--------|                      *                             |         EJB         |
     |                            *                              |  CONTAINER   |
     |                                                           |------------------|
     |
     |                     |--------|
     |                     |   DB   |
     ---------------->|          |
                           |--------|

Rysunek może niezdarny ale mam nadzieje że w miare przejżysty.

Chodzi mi o taki przypadek:

<trandakcja 1>

  1. Servlet odtrzymuje dużo danych
  2. Dane są parsowane
  3. Sparsowane dane zapisywane są do bazy (JPA+JTA)
  4. po zapisaniu danych do bazy wysylana jest wiadomosc na kolejke ze przyszły jakieś dane i można się nimi zająć.
    </transakcja 1>

<transakcja 2>

  1. Gdy dostępny jest message driven bean (MDB) z puli, odbierana jest wiadomość (w sobie tylko znanym czasie)
  2. Na danych zapisanych wczesniej w bazie wykonywane sa pewne operacje prze MDB
  3. Jeżeli wszystkie operacje przebiegly poprawnie to idzie commit wszystkich zmian
  4. Jeżeli coś posżło nie tak, zmiany na bazie sa wycofywane a wiadomośc wraca na kolejke (transakcje CMT)
    <transakcja 2>

Moje pytanie brzmi, czy ta granica między transakcjami lezy tak jak to zaznaczyłem po środku, czy to wszystko odbywa się w jednej transakcji. Servlet nie jest zainteresowany czy wiadomosc dostarczono (kolejka jest trwała i zapisywana na bazie) on tylko wrzuca dane. Z drugiej strony MDB nie powinien uczestniczyc w transakcji rozpoczętej przez servlet.
Czy moje podejście jest słuszne i są dnie transakcje (a jak nie to jak skonfogurować aby były).