我有一个 Spring 应用程序,它使用 WebLogic 中托管的远程无状态 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 客户端如何在集群成员之间划分调用?
- 有没有办法让一系列调用转到同一个集群成员?