Cakarta İşlemleri - Jakarta Transactions

Jakarta İşlemleri ( JTA ; eskiden Java İşlem API) biri Cakarta EE API'ler , etkinleştirir işlemleri dağıtılan çoklu genelinde yapılması gereken X / Open XA bir kaynak Java ortamında. JTA, Java Topluluk Süreci kapsamında JSR 907 olarak geliştirilen bir belirtimdi. JTA şunları sağlar:

  • işlem sınırlarının belirlenmesi
  • Kaynakların işlemlere katılmasına izin veren X/Open XA API.

X/Açık XA mimarisi

X/Open XA mimarisinde, bir işlem yöneticisi veya işlem işleme izleyicisi (TP monitörü), işlemleri veritabanları ve mesaj kuyrukları gibi birden çok kaynakta koordine eder. Her kaynağın kendi kaynak yöneticisi vardır. Kaynak yöneticisinin, kaynağı işlemek için tipik olarak kendi API'si vardır, örneğin ilişkisel veritabanlarıyla çalışmak için JDBC API'si. Ek olarak, kaynak yöneticisi bir TP izleyicisinin kendi ve diğer kaynak yöneticileri arasında dağıtılmış bir işlemi koordine etmesine izin verir. Son olarak, işlemleri başlatmak, onaylamak veya geri almak için TP monitörü ile iletişim kuran uygulama vardır . Uygulama ayrıca kaynağı değiştirmek için kendi API'lerini kullanarak tek tek kaynaklarla iletişim kurar.

X/Open XA mimarisinin JTA uygulaması

JTA API, iki Java paketindeki sınıflardan oluşur :

JTA, X/Open XA mimarisinde modellenmiştir, ancak işlem sınırlarını belirlemek için iki farklı API tanımlar. Bir arasında ayrım uygulama sunucusu gibi en EJB sunucusu ve bir uygulama bileşeni. javax.transaction.TransactionManagerİşlemleri başlatmak, işlemek ve geri almak için uygulama sunucusunun kendisi tarafından kullanılan bir arabirim sağlar . javax.transaction.UserTransactionİşlemleri yönetmek için bir sunucu uygulaması veya bir EJB gibi genel müşteri kodu tarafından kullanılan farklı bir arabirim sağlar .

JTA mimarisi javax.transaction.xa.XAResource, TP monitörü tarafından yönetilmek için her kaynak yöneticisinin arabirimi uygulamasını gerektirir . Daha önce belirtildiği gibi, her kaynağın kendi özel API'si olacaktır, örneğin:

uygulama programlama Arayüzü

Jakarta İşlemleri API'si üç öğeden oluşur: bir üst düzey uygulama işlem sınır belirleme arabirimi, bir uygulama sunucusuna yönelik üst düzey bir işlem yöneticisi arabirimi ve bir işlemsel kaynak yöneticisine yönelik X/Open XA protokolünün standart Java eşlemesi.

Kullanıcı İşlemi arayüzü

javax.transaction.UserTransactionArayüz uygulamayı programlı işlem sınırlarını kontrol etme yeteneği sağlar. Bu arayüz Java istemci programları veya EJB çekirdekleri tarafından kullanılabilir.

UserTransaction.begin()Yöntem küresel hareket başlatır ve çağıran evre ile işlem ilişkilendirir. İşlemden iş parçacığına ilişkilendirme, İşlem Yöneticisi tarafından şeffaf bir şekilde yönetilir.

Yuvalanmış işlemler için destek gerekli değildir. Çağıran iş parçacığı zaten bir işlemle ilişkilendirildiğinde ve işlem yöneticisi uygulaması iç içe işlemleri desteklemediğinde, UserTransaction.begin yöntemi NotSupportedException'ı atar.

Uygulama programları arasında işlem bağlamı yayılımı, istemci ve sunucu makinelerinde temel alınan işlem yöneticisi uygulamaları tarafından sağlanır. Yayılma için kullanılan işlem bağlam formatı protokole bağlıdır ve istemci ile sunucu ana bilgisayarları arasında anlaşmaya varılmalıdır. Örneğin, işlem yöneticisi JTS belirtiminin bir uygulamasıysa , CORBA OTS 1.1 belirtiminde belirtildiği gibi işlem bağlamı yayılma biçimini kullanacaktır. İşlem yayılımı, uygulama programlarına karşı şeffaftır.

@İşlemsel açıklama

javax.transaction.TransactionalEk açıklama uygulamayı bildirimli işlem sınırlarını kontrol etme yeteneği sağlar. Bu açıklama, Jakarta EE belirtiminin yönetilen çekirdek olarak tanımladığı (CDI yönetilen çekirdekleri içerir) herhangi bir sınıfa uygulanabilir.

Aşağıdaki kod örneği, istek kapsamındaki bir CDI yönetilen fasulyesinde @Transactional kullanımını gösterir:

@RequestScoped
public class ExampleBean {

    @Transactional
    public void foo() { // A transaction is active here
        
        // Do work

    } // After the method returns transaction is committed or rolled back
}

İşlem davranışı, açıklamadaki bir öznitelik aracılığıyla yapılandırılabilir. Mevcut seçenekler, EJB spesifikasyonununkileri yakından yansıtır .

@TransactionScoped ek açıklama

javax.transaction.TransactionScopedEk açıklama uygulama bir fasulye hayatları belirli bir işlem etkin zamana bağlıdır sırasında kapsam beyan yeteneği sağlar.

Aşağıdaki kod örneği, istek kapsamındaki bir CDI yönetilen fasulyesinde @TransactionScoped kullanımını gösterir:

@TransactionScoped
public class TxScopedBean {
    public int number;

    public int getNumber() {return number;}
    public void setNumber(int number) {this.number = number;}
}

@RequestScoped
public class ExampleBean {

    @Inject
    private TxScopedBean txScopedBean;

    @Transactional
    public void foo() {
        txScopedBean.setNumber(1);
    }

    @Transactional
    public void bar() {
        System.out.print(tXscopedBean.getNumber());
    }
}

Önce ÖrnekBean'in yönetilen bir örneğinde foo() yöntemi çağrılır ve ardından bar() yöntemi çağrılırsa, yazdırılan sayı 1 değil 0 olur. Bunun nedeni, her yöntemin kendi işlemine ve dolayısıyla kendi TxScopedBean örneğine sahip olmasıdır. . foo() çağrısı sırasında ayarlanan 1 sayısı bu nedenle bar() çağrısı sırasında görülmeyecektir .

EJB sunucusunda UserTransaction desteği

EJB sunucularının, javax.ejb.TransactionManagement ek açıklamada BEAN değeriyle EJB çekirdekleri tarafından kullanılmak üzere UserTransaction arabirimini desteklemesi gerekir (buna çekirdek tarafından yönetilen işlemler veya BMT denir). UserTransaction arabirimi, getUserTransaction yöntemi kullanılarak EJBContext arabirimi aracılığıyla veya genel @Resourceaçıklama kullanılarak doğrudan enjeksiyon yoluyla EJB bileşenlerine sunulur . Bu nedenle, bir EJB uygulaması, işlem sınırlaması için doğrudan İşlem Yöneticisi ile arayüz oluşturmaz; bunun yerine, EJB fasulyesi, Jakarta Enterprise Beans Spesifikasyonunda tanımlandığı gibi tüm işlem çalışmaları için destek sağlamak için EJB sunucusuna güvenir. (EJB Sunucusu ile TM arasındaki temel etkileşim, uygulama için şeffaftır; işlem yönetimini uygulama yükü, EJB kapsayıcı ve sunucu sağlayıcısındadır.)

Aşağıdaki kod örneği, bir EJB oturum çekirdeğinde çekirdek tarafından yönetilen işlemler aracılığıyla UserTransaction kullanımını gösterir:

@Stateless
@TransactionManagement(BEAN)
public class ExampleBean {

    @Resource
    private UserTransaction utx;

    public void foo() {
        // start a transaction
        utx.begin();

        // Do work

        // Commit it
        utx.commit();
    }
}

Alternatif olarak, UserTransaction, SessionContext'ten alınabilir:

@Stateless
@TransactionManagement(BEAN)
public class ExampleBean {

    @Resource
    private SessionContext ctx;

    public void foo() {
        UserTransaction utx = ctx.getUserTransaction();

        // start a transaction
        utx.begin();

        // Do work

        // Commit it
        utx.commit();
    }
}

Yukarıdaki örnekte, @TransactionManagement(BEAN)açıklama atlanırsa, foo()çağrıldığında bir JTA işleminin otomatik olarak başlatıldığını ve foo()çıkıldığında otomatik olarak tamamlandığını veya geri alındığını unutmayın . Bu nedenle EJB programlamasında UserTransaction'ın kullanılması gerekli değildir, ancak çok özel kodlar için gerekli olabilir.

JNDI'da UserTransaction desteği

UserTransaction java:comp/UserTransaction(ortamda bir JTA uygulaması kuruluysa) altında mevcut olmalıdır .

Ayrıca bakınız

Referanslar

Dış bağlantılar