1

我有一个 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 上下文,我将无法重现该问题。

问题:

  1. 我的工作理论现实吗?(请注意,服务器集群对我来说是一个黑匣子)
  2. Spring SimpleRemoteStatelessSessionProxyBean 和/或 WebLogic 客户端如何在集群成员之间划分调用?
  3. 有没有办法让一系列调用转到同一个集群成员?
4

1 回答 1

1

根据经验证据回答我自己的问题。

如果您使用 连接到 Weblogic wlclient.jar,它将使用核心 Java RTE 中的 IIOP 实现。

如果您使用 连接到 Weblogic wlfullclient.jar,它将使用 WebLogic 的专有 T3 协议。

服务器之间的 IIOP 实现循环。

T3 实现似乎与单个服务器保持会话,至少在它可以做到的时候。

于 2012-06-01T13:13:45.067 回答