我正在使用JDeveloper 11.1.1.6.0开发一个应用程序。当我尝试从应用程序中的群集连接到weblogic服务器时,我的客户端应用程序出现问题。某个服务在我想要呼叫的服务器上运行。
情况如下:
有一个weblogic实例,其配置目前无法更改。 weblogic实例具有以下服务器和集群:
我正在尝试连接到 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来解决特定服务器吗?
答案 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提供引用的实例。
使用服务器
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>