1

我正在使用 JDeveloper 11.1.1.6.0 开发应用程序。当我尝试从我的应用程序中的集群连接到 weblogic 服务器时,我的客户端应用程序出现问题。某个服务在我想调用的这台服务器上运行。

情况如下:

有一个 weblogic 实例,我目前无法更改其配置。weblogic 实例具有以下服务器和集群:

  • 管理服务器 AS -(在机器 M1 上运行) URL:A,端口:1 - 连接 URL t3://A:1
  • 集群 C 包含:
    • 服务器 S1 -(在机器 M1 上运行)URL:A,端口:2 - 使用数据库 D1 - 用于连接的 URL t3://A:2
    • 服务器 S2 -(在机器 M2 上运行)URL:B,端口:1 - 使用数据库 D2 - 用于连接t3://B:1的 URL
    • 服务器 S3 -(在机器 M2 上运行)URL:B,端口:2 - 使用数据库 D2 - 用于连接的 URL t3://B:2

我正在尝试连接到t3://A:2而不是集群或其他两台服务器中的任何一台。但是,它每三次才工作一次,可能是因为集群中的三台服务器。集群使用单播进行消息传递,使用循环关联进行负载平衡。

我试图找出导致这种情况的原因。我可以更改运行客户端应用程序(集成或独立)的 weblogic 配置中的某些内容吗?还是必须更改带有服务器集群的实例的配置设置?

先感谢您!

此致

(23.05.2013) 编辑:

在所描述的场景中,我们使用普通的 JNDI-Lookup 来访问远程服务器上的 EJB。

上下文 ctx = new InitialContext();

对象 o = ctx.lookup(...)

...

jndi.properties:

java.naming.provider.url=t3://A:2 java.naming.factory.initial=weblogic.jndi.WLInitialContextFactory

似乎可以通过设置属性 PIN_TO_PRIMARY_SERVER 将 JNDI 请求发送到正确的服务器。然而,后续的 ejb 请求仍然使用循环路由到整个集群......

我们可以在客户端做些什么来改变这种行为以始终使用 url t3://A:2 来寻址特定的服务器吗?

4

1 回答 1

1

我遇到了类似的问题,在尝试更改 InvocationContext 环境属性后,我发现我的运气很差。相反,我不得不为我的无状态会话 bean 更改weblogic-ejb-jar.xml

String destination = "t3://node-alpha:2010";
Hashtable<String, String> env = new Hashtable<String, String>();
env.put( Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
env.put( Context.PROVIDER_URL, destination );
// env.put( weblogic.jndi.WLContext.ENABLE_SERVER_AFFINITY, "true" );
// env.put( weblogic.jndi.WLContext.PIN_TO_PRIMARY_SERVER, "true" );
InitialContext ctx = new InitialContext( env );

EJBHome home = (EJBHome) ctx.lookup( JNDI_REMOTE_SYSTEM_SF );
sf = SomeSf.class.cast( home.getClass().getMethod( "create" ).invoke( home ) );

// Check that we are hitting the right server node.
System.out.println( destination + " => " + sf );

一旦开始事务,就不应更改服务器,因此我将创建一个无状态 bean 来接收目标调用,并从那里开始您打算做的工作。您可以weblogic-ejb-jar.xml. 您实际上需要设置下面列出的两个项目。

  • <home-is-clusterable>False</home-is-clusterable>
  • <stateless-bean-is-clusterable>False</stateless-bean-is-clusterable>

这意味着当通过初始上下文获取引用时,目标服务器将提供对该特定集群节点上无状态 bean 的引用实例。

使用服务器

  • 节点阿尔法:2010
  • 节点阿尔法:2011
  • 节点测试版:3010
  • 节点测试版:3011

使用home-is-clusterable&stateless-bean-is-clusterable设置为true

这里的第一个条目是它所针对的服务器,然后其余条目用于故障转移和/或负载平衡(例如循环)。

ClusterableRemoteRef(
3980825488277365621S:node-alpha:[2010,2010,-1,-1,-1,-1,-1]:MyDomain:node-alpha 
[
  3980825488277365621S:node-alpha:[2010,2010,-1,-1,-1,-1,-1]:MyDomain:node-alpha/338, 
  4236365235325235233S:node-alpha:[2011,2011,-1,-1,-1,-1,-1]:MyDomain:node-alpha/341, 
  1321244352376322432S:node-beta:[3010,3010,-1,-1,-1,-1,-1]:MyDomain:node-beta/342, 
  4317823667154133654S:node-beta:[3011,3011,-1,-1,-1,-1,-1]:MyDomain:node-beta/345
]
)/338

使用home-is-clusterable&stateless-bean-is-clusterable设置为false

weblogic.rmi.internal.BasicRemoteRef - hostID: '-3980825488277365621S:node-alpha:[2010,2010,-1,-1,-1,-1,-1]:MyDomain:node-alpha', oid: '336', channel: 'null'

下面的 weblogic-ejb-jar.xml 示例。

<weblogic-ejb-jar>
  <weblogic-enterprise-bean>
    <ejb-name>SomeSf</ejb-name>
    <stateless-session-descriptor>
      <pool>
        <max-beans-in-free-pool>42</max-beans-in-free-pool>
      </pool>
      <stateless-clustering>
        <home-is-clusterable>false</home-is-clusterable>
        <stateless-bean-is-clusterable>false</stateless-bean-is-clusterable>
        <stateless-bean-methods-are-idempotent>true</stateless-bean-methods-are-idempotent>
      </stateless-clustering>
    </stateless-session-descriptor>
    <transaction-descriptor>
      <trans-timeout-seconds>20</trans-timeout-seconds>
    </transaction-descriptor>
    <enable-call-by-reference>true</enable-call-by-reference>
    <jndi-name>SomeSf</jndi-name>
  </weblogic-enterprise-bean>
</weblogic-ejb-jar>
于 2014-05-16T16:07:09.413 回答