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>
- Servlet odtrzymuje dużo danych
- Dane są parsowane
- Sparsowane dane zapisywane są do bazy (JPA+JTA)
- 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>
- Gdy dostępny jest message driven bean (MDB) z puli, odbierana jest wiadomość (w sobie tylko znanym czasie)
- Na danych zapisanych wczesniej w bazie wykonywane sa pewne operacje prze MDB
- Jeżeli wszystkie operacje przebiegly poprawnie to idzie commit wszystkich zmian
- 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).