【问题标题】:Weblogic clustering configurationWeblogic集群配置
【发布时间】:2013-05-16 14:08:44
【问题描述】:

我正在使用 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 配置中的某些内容吗?还是必须更改带有服务器集群的实例的配置设置?

提前谢谢你!

最好的问候

(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-requests 仍然使用循环路由到整个集群...

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

【问题讨论】:

  • 像 t3://A:2 一样直接连接应该可以工作...当它失败时,您是否会收到某种错误消息,您可以发布吗?我可以毫无问题地访问集群中特定机器上的 WSDL/代理。
  • 没有错误信息。我只是以循环方式路由到其他两台服务器。每三次到我想连接的那个。我认为这与集群的管理服务器和我想要访问的服务器位于同一台机器和 URL 上(只是端口号不同)这一事实有关。可能是我与客户端应用程序的集成 weblogic 错误地连接到集群并因此路由到三个之一?谢谢。
  • 也许可以编辑您的帖子并输入一些关于您如何连接/您到底想做什么的代码?是 JMS 吗?它是 WSDL 吗?等
  • 我们已经发布了关于我们的上下文的信息。谢谢。
  • 基于此信息:docs.oracle.com/cd/E11035_01/wls100/jndi/jndi.html 我不确定您是否能够做您想做的事。 “WebLogic Server 中的上下文工厂可以选择集群中似乎最适合客户端的任何 WebLogic Server” 除非您将特定部署定位到单个节点,否则 weblogic 将继续在集群中循环您。为什么你需要使用那个特定的服务器?如果您只想在一个节点上提供服务,请更改目标。

标签: configuration weblogic cluster-computing jdeveloper


【解决方案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 中将无状态bean 设置为不可集群。您实际上需要设置下面列出的两个项目。

  • &lt;home-is-clusterable&gt;False&lt;/home-is-clusterable&gt;
  • &lt;stateless-bean-is-clusterable&gt;False&lt;/stateless-bean-is-clusterable&gt;

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

使用服务器

  • 节点阿尔法:2010
  • 节点阿尔法:2011
  • node-beta:3010
  • node-beta:3011

home-is-clusterablestateless-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-clusterablestateless-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>

【讨论】:

    猜你喜欢
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    • 2023-03-10
    • 2011-08-22
    • 2015-06-26
    • 1970-01-01
    相关资源
    最近更新 更多