簡體   English   中英

在事務內進行無事務的EJB調用

[英]Make transactionless EJB call inside a transaction

我將盡力描述這種情況。 我們有一個網絡服務; 在每個請求Web服務上啟動JTA事務。 它通過XA數據源執行多個數據庫調用,並調用其他Web服務(不在事務上下文中),還在其他服務器上進行了幾個遠程EJB調用。

問題是容器似乎試圖將EJB納入事務中(這似乎是合乎邏輯的),但是實際上我希望它不參與該事務,因為當它確實參與該事務時,它總是在最后的提交階段中超時,但是當我排除EJB調用時,它可以正常工作。

我不能更改EJB實現,而只能控制Web服務代碼。 因此,我的問題是:我如何在JTA事務之外,但仍在JTA事務中進行其他XA資源的情況下,對可感知事務的EJB進行EJB調用? 我希望我的問題很清楚:)。

編輯 :試圖使它與偽代碼示例更加清晰:

// Begin transaction
UserTransaction tx = (UserTransaction) ctx.lookup(USER_TRANSACTION);
tx.begin();

// Do some database operations on XA datasource

// Call remote EJB which has transcation attribute set to 'Supports'
AccountInfo account = accountEjb.getAccountInfo(userId, accountId); // <-- Is it possible to make this to be not be part of user transction?

// Do some more database operations on XA datasource

// Commit transaction
tx.commit();

您可以使用適當的事務屬性創建另一個bean。 該bean可以將所有調用委派給第一個bean。

或者,您可以從另一個線程調用此ejb。

EJB事務是聲明性的:對於給定EJB的給定部署,請指定其事務語義。 可以部署確切的EJB(當然,可以使用其他名稱),並且可以為該部署指定不同的需求。 假設(a)您至少擁有ejb的jar,並且(b)所討論的ejb是獨立的,並且不依賴於其他組件,並且(c)ejb hasn的開發人員並沒有違反聲明式事務的想法,他的bean在事務上下文之外也可以工作。

您可以使用合適的tx屬性創建另一個方法,然后通過自注入代理(偽代碼)進行調用:

@Stateless
public class LocalEJB1 {

    @EJB
    private LocalEJB1 localEJB1;

    @EJB
    private AccountEJB accountEjb;

    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
    public AccountInfo callNonTx() { 
        return accountEjb.getAccountInfo(userId, accountId); 
    }

    public void yourCurrentMethod() {
        // Begin transaction
        UserTransaction tx = (UserTransaction) ctx.lookup(USER_TRANSACTION);
        tx.begin();

        AccountInfo account = localEJB1.callNonTx();
        // Do some more database operations on XA datasource

        // Commit transaction
        tx.commit();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM