2012-05-31 36 views
1

我有一個Spring應用程序,它使用WebLogic中託管的遠程無狀態EJB。通過Spring訪問集羣遠程EJB的間歇性故障

<jee:remote-slsb id="itemService" 
    jndi-name="org.example.ItemService" 
    business-interface="org.example.ItemService" 
    cache-home="false" lookup-home-on-startup="false" 
    home-interface="org.example.ItemServiceHome" 
    resource-ref="false" refresh-home-on-connect-failure="true"> 
    <jee:environment> 
     java.naming.factory.initial=weblogic.jndi.WLInitialContextFactory 
     java.naming.provider.url=t3://server1:7101,server2:7101 
    </jee:environment> 
</jee:remote-slsb> 

我的應用程序會從這樣的服務器項目:

ItemEntry[] itemEntries = itemService.listAvailableItems(criteria); 
for(ItemEntry entry: itemEntries) { 
    Item item = itemService.getItemAccessObject(entry.getKey()); 
    // Do something with item 
} 

也能正常工作的大部分時間。

然而,當該項目是很新的(並在數據庫中的最後幾秒鐘),我得到間歇性故障時,我嘗試用項目做任何事情:

java.rmi.NoSuchObjectException: CORBA OBJECT_NOT_EXIST 1330446337 No; nested exception is: 
     org.omg.CORBA.OBJECT_NOT_EXIST: vmcid: OMG minor code: 1 completed: No 

對於新對象,如上所述,失敗似乎發生了大約50%的嘗試,並且在for()循環內會有失敗和成功的混合。

如果我改變t3://地址只包含一個主機名:端口,問題就會消失。因此,我的工作理論是,listAvailableItems()調用將轉到羣集中的一個服務器 - 問題中的項目已到達,並且失敗的getItemAccessObject()調用將轉到另一個服務器,其中項目仍在同步。

如果我自己繞過Spring並管理EJB上下文,我無法重現該問題。

問題:

  1. 是我的工作原理現實嗎? (注意服務器集羣對我來說是個黑盒子)
  2. Spring SimpleRemoteStatelessSessionProxyBean和/或WebLogic客戶端如何在集羣成員之間劃分呼叫?
  3. 有沒有辦法讓呼叫序列轉到同一個集羣成員?
+0

請仔細標註標籤。這與[tag:cluster-analysis]有什麼關係?相反,將其重新標記爲[tag:cluster-computing]。 –

+0

糟糕。我確定我只是將它標記爲「集羣」 – slim

+0

「集羣」和「集羣」是模糊的,後者至少被設置爲聚類分析的同義詞。 –

回答

1

基於經驗證據回答我自己的問題。

如果使用wlclient.jar連接到Weblogic,它將在覈心Java RTE中使用IIOP實現。

如果使用wlfullclient.jar連接到Weblogic,它使用WebLogic專有的T3協議。

IIOP在服務器之間執行round-robins。

T3實現似乎與單個服務器保持會話,至少在可以的情況下。