JMS a transakce

Transakce (lokální) jsou jasně popsány ve specifikaci JMS 1.1 v kapitolách 4.4.7 a 4.4.8. Sezení v JMS může být volitelně v transakci, kdy všechny zprávy zaslané v jedné transakci mohou být (explicitně i implicitně) potvrzeny (commit). Jedná se o zřetězené transakce (chained), každé volání commit nebo rollback vytvoří novou transakci. Dobře je vidět na obrázku z tutoriálu k JMS, že jedno poslání zprávy a konzumace jsou vlastně dvě lokální transakce. Tato volání také potvrzují (nebo odvolávají) všechny zprávy v transakci – nejedná se tedy o distribuované transakce. V případě, že při zpracování dojde k chybě, může být zavolán rollback nebo recover. V prvním případě příjemce musí uvést všechny zdroje do původního stavu a odesílatel se dozví o tom, že transakce neproběhla. V případě volání recover se sezení zastaví a znovu spustí počínaje první zprávou v transakci.

Lokální transakce jsou tedy vhodné pro jednoho odběratele. Není možné potvrdit víc akcí pomocí jediného volání commit a musí být využito jiného způsobu, například dvoufázový commit. To se týká například i cílů, které jsou přemostěny (v EMS).

V případě distribuovaných transakcí specifikace nenařizuje, aby dodavatel JMS implementoval JTA API, ale většina to tak dělá. Pokud tedy podpora pro Java Transaction API v JMS produktu je, je doporučeno použít XAResource API (X/Open CAE Specification – Distributed Transaction Processing: The XA Specification). Například produkt TIBCO EMS 4.4 podporuje plně JTA s omezením – u transakcí (i lokálních) nelze použít routing. Naopak v případě bridge jsou všechny zprávy doručeny v rámci jedné transakce.

Při použití distribuovaných transakcí dodavatel implementuje třídy XAConnectionFactory, XAConnection, XASession a jiné, které rozšiřují třídy (ConnectionFactory, Connection, Session…) o žádanou funkčnost. Příjemci tedy mohou pracovat se sezením, jako by byl v lokální transakci a zavolat například rollback. JMS implementace již zajistí zpropagování přes JTA. Třída XASession má metodu, pomocí které se můžete dostat na třídu XAResource, ve které jsou další funkce, které jsou potřeba pro zajištění vícefázového commitu.

Odkazy

Diskuze

Lukáš Zapletal, 30.10.2007 16:56:

Pepo upravil jsem poslední odstavec, trvalo hodinu, než jsem se prokousal JMS a JTA specifikacemi, v dokumentaci k TIBCO EMS toho moc nebylo, víc informací jsem našel až v EMS Java API.

 
If you can't read the letters on the image, download this .wav file to get them read to you.
pridej.cz
blog/jms_a_transakce.txt · Poslední úprava: 29.05.2008 09:04 (external edit)
Creative Commons License Valid CSS Driven by DokuWiki Recent changes RSS feed Valid XHTML 1.0