Weblogic集群配置

时间:2013-05-21 17:42:47

标签: configuration weblogic cluster-computing jdeveloper

我正在使用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 - 用于连接的URL t3:// B:1
    • 服务器S3 - (在机器M2上运行)URL:B,端口:2 - 使用数据库D2 - 用于连接的URL t3:// B:2

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

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

提前谢谢!

最好的问候

(适用2013年5月23日) 编辑:

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

Context 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-Request发送到正确的服务器。然而,后续的ejb请求仍然使用循环法路由到整个集群......

我们可以在客户端执行某些操作来更改此行为,以便始终使用url t3:// A:2来解决特定服务器吗?

1 个答案:

答案 0 :(得分:0)

我有类似的问题,在尝试更改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中将无状态bean设置为不可群集。您实际上需要设置下面列出的两个项目。

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

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

使用服务器

  • 节点-α:2010
  • 节点-α:2011
  • 节点-β:3010
  • 节点-β:3011

home-is-clusterable&amp; 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&amp; 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>