2011-08-09 44 views
2

我有一個豐富的客戶端應用程序調用遠程有狀態ejb。我正在使用JBoss 6.0。來自不同客戶端的EJB3有狀態併發調用

我在兩臺不同的機器,即不同的IP地址,JVM上,等部署在客戶端

的狀態具有下面的代碼:

@Stateful 
public class MyStateful implements MyStatefulRemote{ 

public void test(){  
    System.out.println(this); 
    System.out.println(Thread.currentThread()); 
    System.out.println(Thread.currentThread().getThreadGroup()); 

    // cpu intensive task     
    String value = ""; 
    for (int j = 0; j < Integer.MAX_VALUE; j++) { 
     value = "" + j; 
    } 
} 

而且客戶端具有以下代碼:

... 
String JNDI_FACADE = "MyStateful/remote"; 
InitialContext context = new InitialContext(); 
MyStatefulRemote my = (MyStatefulRemote) context.lookup(JNDI_FACADE); 
my.test(); 

然後,當我運行在第一客戶端中,EJB執行的println命令和開始執行循環(如預期)。但是,當我在另一臺機器上運行第二臺客戶機時,在第一個方法調用完成之前,ejb不會打印任何內容。換句話說,有狀態bean似乎還不能處理併發呼叫,即使是來自不同的客戶端。

如果我們看一下println的命令,我們可以看到:

[email protected] 
WorkerThread#6[192.168.7.58:54271] 
java.lang.ThreadGroup[name=jboss,maxpri=10] 

,並在服務器完成第一調用的執行,那麼,第二invokation打印輸出:

[email protected] 
WorkerThread#1[192.168.7.53:54303] 
java.lang.ThreadGroup[name=jboss,maxpri=10] 

我可以注意到有兩種不同的有狀態實例(如預期的那樣,每個客戶端有一個實例),它們運行在不同的線程中。

當我使用無狀態而不是有狀態時,它可以工作。但是,在我的應用程序中,我需要保留來自客戶端的一些數據,而有狀態似乎更合適。

回答

0

默認情況下,EJB不允許併發調用有狀態bean。我知道,在Weblogic服務器上,您可以使用allow-concurrent-calls屬性啓用此功能。在JBoss上,很可能你將不得不重新設計你的架構並使用無狀態bean。

+0

的問題是,它不應該允許在同一個SFSB實例和日誌清楚地顯示兩個單獨的實例併發呼叫。 –

+2

Piotrek,我明白,這個限制只適用於對同一個bean實例進行併發調用的情況。另外,服務器爲每個不同的客戶端創建一個不同的狀態實例。然後,當我們對不同的有狀態bean實例進行併發調用時,我希望服務器可以同時處理這兩個請求。 – r0drigopaes

+1

來自規範: ...如果客戶端調用的業務方法正在對實例進行時,來自相同或不同客戶端的另一個客戶端調用的調用到達同一個STATEFUL BEAN CLASS類,則第二個客戶端是Bean的 業務接口的客戶端,併發調用可能導致第二個客戶端接收到javax.ejb.ConcurrentAccessException – r0drigopaes

相關問題