Java Transaction API
Java Transaction API ( JTA ) on yksi Java EE : n ( Java Enterprise Edition ) tarjoamista API , ja se on tarkoitettu mahdollistamaan hajautetut tapahtumat , jotka suoritetaan useiden X / Open XA - resurssien välillä Java - ympäristössä . JTA on spesifikaatio, joka on kehitetty Java Community Process -ohjeiden mukaisesti nimellä JSR 907 . JTA tarjoaa:
- kaupan rajojen rajaaminen.
- X / Open XA -sovellusliittymistä , jotka mahdollistavat resurssien osallistumisen tapahtumiin.
X / Open XA Architecture
Tässä arkkitehtuurissa Transaction Manager tai Transaction Processing Monitor (TP-monitori) koordinoi tapahtumia useiden resurssien, kuten tietokantojen tai viestijonojen, välillä. Jokaisella resurssilla on oma resurssienhallinta. Resurssienhallinta käyttää yleensä omia sovellusliittymiään manipuloidakseen resursseja, kuten saadakseen JDBC API:t toimimaan relaatiotietokantojen kanssa. Resurssienhallinta sallii myös TP-monitorin koordinoida hajautettua tapahtumaa itsensä ja muiden resurssienhaltijoiden välillä. Lopuksi sovellus, joka kommunikoi TP-monitorin kanssa, käynnistyy suorittamaan tyypillisiä tapahtumatoimintoja, kuten aloitus (aloitus), vahvistus ja palautus . Sovellus myös kommunikoi yksittäisten resurssien kanssa muokatakseen niitä käyttämällä omaa API:ta.
JTA:n toteutus X / Open XA -arkkitehtuurissa
JTA API koostuu sarjasta luokkia, jotka on jaettu kahteen seuraavaan Java-pakettiin :
JTA on rakennettu X / Open XA -arkkitehtuurin malliin, mutta se määrittelee kaksi erilaista API:ta tapahtumarajojen rajaamiseen. Sovelluspalvelin , kuten EJB -palvelin, ja sovelluskomponentti erotetaan toisistaan . Se tarjoaa javax.transaction.TransactionManager- liittymän , jota varsinainen sovelluspalvelin käyttää tapahtumien aloituksiin, sitoumuksiin ja palautuksiin. Se tarjoaa myös erilaisen käyttöliittymän, javax.transaction.UserTransaction , jota yleinen asiakaskoodi, kuten servlet tai EJB, käyttää tapahtumien hallintaan.
JTA-arkkitehtuuri edellyttää, että jokainen Resource Manager ottaa käyttöön javax.transaction.xa.XAResource- liittymän , jotta TP-monitori hallitsee sitä. Kuten yllä selitettiin, jokaisella resurssilla on oma erityinen API, esimerkiksi:
- Relaatiotietokannat käyttävät JDBC:tä
- Viestipalvelut käyttävät JMS:ää
- Generalised Enterprise Information System (EIS) -resurssit käyttävät Java EE Connector Architecturea.
Java Transaction API
Java Transaction API koostuu kolmesta elementistä: sovelluksen korkean tason tapahtuman rajausrajapinnasta, aina korkean tason Transaction Manager -liittymästä ja X / Open XA -protokollan standardi Java-kartoituksesta, joka on tarkoitettu transaktioresurssien hallintaan.
UserTransaction- käyttöliittymä
Javax.transaction.UserTransaction- liittymä tarjoaa sovellukselle mahdollisuuden tarkistaa tapahtumarajat ohjelmallisesti. Tätä käyttöliittymää voivat käyttää asiakaspuolen Java-ohjelmat tai EJB-pavut.
Aloitus () -menetelmä aloittaa globaalin tapahtuman ja liittää sen kutsuvaan säikeeseen. Tapahtuman hallinta käsittelee transaktio-säie-assosiaatiota avoimesti.
Sisäkkäisille tapahtumille ei tarvita tukea. Aloitus () -menetelmä heittää NotSupportedExceptionin , kun säie on jo liitetty tapahtumaan ja Transaction Manager -toteutus ei tue sisäkkäisiä tapahtumia.
Konteksti, jossa tapahtuma etenee sovellusten välillä, määritetään asiakas- ja palvelinkoneissa olevien tapahtumien hallintaohjelmien taustatoteutuksilla. Etenemiseen käytetty kontekstimuoto on protokollariippuvainen, ja siitä on neuvoteltava asiakkaan ja palvelimen isäntien välillä. Jos Transaction Manager on esimerkiksi JTS :n spesifikaatioiden toteutus , se käyttää CORBA OTS 1.1:ssä määritettyä. Tapahtuman eteneminen on läpinäkyvää sovellukselle.
@Transactional annotation
Javax.transaction.Transactional - merkintä antaa sovellukselle mahdollisuuden tarkistaa tapahtumarajat deklaratiivisesti. Tätä merkintää voidaan soveltaa mihin tahansa luokkaan, jonka Java EE määrittelee hallituksi papuksi (johon sisältyy CDI-hallitut pavut).
Alla oleva koodiesimerkki havainnollistaa @Transactionalin käyttöä alueella, jossa vaaditaan CDI-hallittuja papuja:
@RequestScoped
julkinen luokka EsimerkkiBean {
@Transactional
public void foo () { // Tapahtuma on aktiivinen täällä
// Suorita jokin koodi
} // Palautuksen jälkeen tapahtuma sitoutuu tai peruutetaan
}
Tapahtuman käyttäytyminen voidaan määrittää merkinnässä olevalla attribuutilla.
@TransactionScoped- merkintä
javax.transaction.TransactionScoped - merkintä antaa sovellukselle mahdollisuuden ilmoittaa, että laajuus, jonka aikana bean elää, liittyy aikaan, jolloin tietty tapahtuma on aktiivinen.
Alla oleva koodiesimerkki näyttää @TransactionScopedin käytön alueella, jossa vaaditaan CDI-hallittuja papuja:
@TransactionScoped
public class TxScopedBean {
julkinen int numero ;
public int getNumber () { paluunumero ; } public void setNumber ( int numero ) { this . numero = numero ;} }
@RequestScoped
julkinen luokka EsimerkkiBean {
@Inject
yksityinen TxScopedBean txScopedBean ;
@Transactional
public void foo () {
txScopedBean . setNumber ( 1 );
}
@Transactional
public void bar () {
Järjestelmä . ulos . tulosta ( tXscopedBean . getNumber ());
}
}
Jos EsimerkkiBeanin hallitussa ilmentymässä kutsutaan ensin foo () -menetelmää ja sitten kutsutaan bar () -menetelmää , näytölle tulostetaan numero 0 eikä 1. Tämä johtuu siitä, että jokaisella menetelmällä on oma tapahtumansa ja siksi myös TxScopedBeanin oma esiintymä. Numero 1, joka on annettu puhelun foo () aikana, ei siksi näy puhelun aikana bar () .
UserTransaction- tuki EJB-palvelimilla
EJB - palvelimien on tuettava UserTransaction- käyttöliittymää EJB-pavuille, joiden BEAN-arvo on javax.ejb.TransactionManagement-merkinnässä (tätä kutsutaan bean-managed-tapahtumaksi tai BMT:ksi). UserTransaction- käyttöliittymä altistetaan EJB-komponenteille sekä EJBContext-liittymän kautta getUserTransaction-menetelmää käyttäen että suoraan käyttämällä yleistä @Resource- merkintää . Siksi EJB-sovellus ei liity suoraan Transaction Manageriin tapahtuman rajaamista varten; Sen sijaan EJB-pavut luottavat EJB-palvelimeen tukemaan kaikkea sen transaktiotyötä Enterprise JavaBeans -määrityksen mukaisesti. (Taustalla oleva vuorovaikutus EJB-palvelimen ja TM:n välillä on läpinäkyvää sovellukselle; tapahtumien hallinnan toteuttamisen taakka on EJB-säilön ja palvelimen toimittajalla.)
Alla oleva esimerkkikoodi havainnollistaa UserTransactionin käyttöä bean-hallittujen tapahtumien kautta EJB Bean -istunnossa:
@Stateless
@TransactionManagement ( BEAN )
julkinen luokka EsimerkkiBean {
@Resource
yksityinen UserTransaction utx ;
public void foo () {
// aloita tapahtuma
utx . alkaa ();
// Tehdä työtä
// Sitouta se
utx . sitoutua ();
}
}
Vaihtoehtoisesti UserTransaction voidaan hankkia SessionContextista :
@Stateless
@TransactionManagement ( BEAN )
julkinen luokka EsimerkkiBean {
@Resource
private SessionContext ctx ;
public void foo () {
UserTransaction utx = ctx . getUserTransaction ();
// käynnistä tapahtuma
utx . alkaa ();
// Tehdä työtä
// Sitouta se
utx . sitoutua ();
}
}
Huomaa, että esimerkissä, jos @TransactionManagement (BEAN) -merkintä olisi jätetty pois, JTA-tapahtuma olisi alkanut automaattisesti aina , kun foo () kutsutaan , ja jälleen automaattisesti, vahvistus ja palautus tapahtuisi poistuttaessa foo ( ) . UserTransactionin käyttö ei siis ole välttämätöntä EJB-ohjelmoinnissa, mutta sitä voidaan vaatia erikoistuneemmassa koodissa.
UserTransaction- tuki JNDI:ssä
UserTransaction on saatavilla javassa : comp / UserTransaction , jos ympäristöösi on asennettu JTA-toteutus.
JTA:n avoimen lähdekoodin toteutukset
Joitakin avoimen lähdekoodin toteutuksia JTA:lle on lueteltu alla (syyskuussa 2010):
- Narayana
- Atomikos TransactionsEssentials
- Bitronix JTA
Aiheeseen liittyvät tuotteet
Ulkoiset linkit
- ( EN ) Virallinen sivusto , osoitteessa projects.eclipse.org .
- Java Transaction API - lähdetietovarasto osoitteessa github.com .