close

Java Transaction API

Siirry navigointiin Siirry hakuun

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