3

中遠程EJB方面,我有以下情況:關閉管理的事務

  1. 客戶端調用無狀態本地EJB - 管理的事務開始這個調用
  2. 本地EJB構建的InitialContext並查找遠程EJB
  3. 本地EJB調用遠程EJB上的方法
  4. 本地EJB關閉上下文並連接到遠程EJB
  5. 容器嘗試提交事務

分佈式事務不能被提交,因爲連接到事務的遠程EJB無法聯繫,因爲連接到它已關閉。

我的問題是:是否有可能在事務處於活動狀態時使用遠程EJB調用?我應該如何關閉用於查找遠程EJB的上下文?

下面的僞代碼說明我的問題:

@Stateless 
public class LocalEjb { 

    public void localEJBMethod() { 
    //transaction starts before this method execution 

    Context ctx = //create initial context 
    RemoteEjb remoteEjb = (RemoteEjb) ctx.lookup("jndi name"); 
    remoteEjb.remoteMethod(); //remote EJB takes part in distributed transaction 
    ctx.close();  

    //error occurrs when container tries to commit distributed transaction after 
    //this method returns 
    } 
} 


public class ClientClass { //a CDI component, for example 
    @EJB 
    private LocalEjb localEjb; 

    public void clientMethod() { 
     localEjb.localEjbMethod(); 
    } 
} 

回答

0

該交易將正常工作,因爲應用服務器使用XA(分佈式)事務。

擺脫ctx.close()的

它實際上沒有關閉遠程EJB的連接(由動態代理對象處理)你正在關閉訪問JNDI上下文,其中包含手柄爲交易經理。

還請記住,您需要讓容器知道您正在使用另一個EJB。所有容器管理對象都需要嚮應用程序服務器聲明他們的資源需求(ejbs,datasources等)。在關於你的例子中,你會把你的聲明放在ejb-jar.xml中。

您可能會考慮對遠程EJB使用@EJB註釋,而不是顯式查找。這將嚮應用程序服務器聲明資源使用情況,並將爲您管理參考。