我有一個豐富的客戶端應用程序調用遠程有狀態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]
我可以注意到有兩種不同的有狀態實例(如預期的那樣,每個客戶端有一個實例),它們運行在不同的線程中。
當我使用無狀態而不是有狀態時,它可以工作。但是,在我的應用程序中,我需要保留來自客戶端的一些數據,而有狀態似乎更合適。
的問題是,它不應該允許在同一個SFSB實例和日誌清楚地顯示兩個單獨的實例併發呼叫。 –
Piotrek,我明白,這個限制只適用於對同一個bean實例進行併發調用的情況。另外,服務器爲每個不同的客戶端創建一個不同的狀態實例。然後,當我們對不同的有狀態bean實例進行併發調用時,我希望服務器可以同時處理這兩個請求。 – r0drigopaes
來自規範: ...如果客戶端調用的業務方法正在對實例進行時,來自相同或不同客戶端的另一個客戶端調用的調用到達同一個STATEFUL BEAN CLASS類,則第二個客戶端是Bean的 業務接口的客戶端,併發調用可能導致第二個客戶端接收到javax.ejb.ConcurrentAccessException – r0drigopaes