Globalne transakcje z udziałem servletów, ejb3 oraz kolejek

0

Witam

Mam oto taki problem. Pisze aplikację w której intefejsem jest servlet http który otrzymuje żądanie, parsuje je (sprawdzając przy tym poprawność żądania) i wykorzystując wstrzyknięty do servletu bean ejb dodaje wiadomości na kolejke jms. Z tej kolejki wiadomości zbierane są przez message driven beana. Mój problem polega na tym że chciałbym aby cały ten proces był transakcyjny.

Aplikacja ta ma przetwarzać b.dużo danych (zapytanie http może mieć 1,5 gb w contencie) na podstawie tego zapytania servlet może wygenerować powiedzmy milion wiadomości które wrzuca na kolejke. Całość dzieje sie w czesie rzeczywistym, ściągamy blok danych parsujemy go sprawdzamy poprawność danych tworzymy wiadomości i wrzucamy je na kolejke poprzez bezstanowego ejb'ka (i tak dla każdego bloku). Mój problem polega na tym że np w połowie przetwarzania danych w n-tym bloku requestu parametry okażą sie niepoprawne i chciałbym wykonać rollback czyli nie przyjmuje kolejnych bloków danych oraz wycofane sa wiadomości dotychczas puszczone na kolejke. O ile beany (te które dodają wiadomości na kolejke oraz message driven beany je odbierające) są zarządzane przez kontener to servlet musi być transakcją zarządzaną przez użytkownika. Pytanie moje brzmi jak taki mechanizm zorganizować to znaczy czy to jest transakcja rozproszona a jeśli tak (lub nie) to jak ją w servlecie obsłużyć. Korzystam z JEE5 oraz servera JBOSS.

0

Rozbij transakcje na kilka etapów.

  1. Czytasz i zapisujesz w kolejce tymczasowej dane.
  2. Z kolejki tymczasowej pobierasz dane do walidatora.
  3. Walidator może wstawić dane do kolejnej kolejki tymczasowej lub przerwać cały proces, czyszcząc obie kolejki tymczasowe, w momencie gdy masz błąd.
  4. Po zakończeniu wczytywania danych wykonujesz zapis z drugiej kolejki ze sprawdzonymi wiadomościami do kolejki właściwej.

Cała operacja jest nie tyle co rozproszona co długotrwała.

0

Musisz wywolac beana w konteksie transakcyjnym:

  1. w servlecie wziac za pomoca JNDI UserTransation
  2. zaczac transakcje
  3. wywolac EJB ktory ma atrybut np TransactionAttribute REQUIRED, MANDATORY
  4. ten EJB ma wstrzyknieta kolejke
  5. dodawanie na kolejke jest wykonywane w kontekscie transakcji zaczetej w servlecie
  6. jak dasz rollback w servlecie, to bean bedzie mial rollback, a co za tym idzie wszelkie wiadomosci zlozone na kolejce zostana z niej usuniete
0

Tak właśnie myślałem. Ale co z message driven beanami które sa na kolejce. Czy o ne zaczną odbierać dane po commicie czy już w trakcie dodawania na klejke. To dla mnie ważne bo operacje które wykonują beany nie są już transakcyjne i nie da się ich cofnąć.

0

To co robi EJB i ma mozliwosc bycia transakcyjne (jak np dzialania na entity managerze, dzialania na kolejkach, jakies dzialania na komponenta JCA itp) sa cofane wraz z rollbackiem o ile zasoby te byly tak skonfigurowane aby brac udzial w transakcjach rozproszonych. Mozesz przeciez sam stworzyc taka kolejke i wysylac na nia i recznie robic commita albo nawet miec autocommita dla connection z JDBC, i wtedy wiadomo, inna sprawa. W Twoim przypadku zakladam ze kolejka jest wstrzykiwana i transakcjami zajmuje sie kontener, wiec kolejka powinna zostac wyczyszczona.
Jak soknczysz, napisz tutaj update jak poszlo.

0

Wszystko fajnie zadziałało. Transakcje globalne działały tak jak się spodziewałem i opisaloście to w postach. Dzięki za pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1