我有一個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上下文,我無法重現該問題。
問題:
- 是我的工作原理現實嗎? (注意服務器集羣對我來說是個黑盒子)
- Spring SimpleRemoteStatelessSessionProxyBean和/或WebLogic客戶端如何在集羣成員之間劃分呼叫?
- 有沒有辦法讓呼叫序列轉到同一個集羣成員?
請仔細標註標籤。這與[tag:cluster-analysis]有什麼關係?相反,將其重新標記爲[tag:cluster-computing]。 –
糟糕。我確定我只是將它標記爲「集羣」 – slim
「集羣」和「集羣」是模糊的,後者至少被設置爲聚類分析的同義詞。 –