我在Weblogic上运行了两个集群托管服务器,并且每个托管服务器上都运行了单独的JMS server1 and server2
。问题出在应用程序属性文件中,我们只对硬编码并将JMS server1 JNDI name
传递给应用程序。因此,在每个节点上运行的两个应用程序实际上只使用一个固定的JMS服务器,该服务器不是真正分布式和集群的如果JMS服务器1关闭,整个应用程序将关闭。
我的问题是如何让应用程序在上面的senario中动态查找JMS服务器?你能指点我一个方向吗?谢谢!
答案 0 :(得分:4)
它位于Weblogic文档:http://docs.oracle.com/cd/E14571_01/web.1111/e13738/best_practice.htm#CACDDFJD
基本上你创建了一个以逗号分隔的服务器列表,当其中一个服务器关闭时,JMS连接逻辑应该能够自动处理:
e.g。
t3://hostA:7001,hostB:7001
答案 1 :(得分:1)
使用jms.jndi.provider.url = t3:// hostA:31122等属性时,hostA:31124
它告诉wls连接到hostA:31122或hostA:31124。
请注意,您的JMS客户端在任何给定时间都只连接到一个主机。
当您关闭hostA时,JMS客户端和服务器之间的连接突然切断导致异常,您的代码将必须正常处理此异常并尝试再次定期连接到WLS以确保它连接到hostB。
如果有多个JMS客户端实例正在运行,WLS将在内部循环访问请求。
将MDB用作JMS客户端并将其部署到群集并使用此类URL时,1 mdb实例将连接到一个主机,另一个实例将连接到另一个主机。 MDB本身也具有定期重新连接到JMS目标的能力。
解决问题的简单方法可能是 1)设置jms.jndi.provider.url = t3:// hostA:31122,hostA:31124 2)运行2个JMS客户端代码实例,一个连接到端口31122,另一个连接到31124 3)在JMS队列上设置Forward-Delay,以便消息不会保留在队列中而不会长时间消耗并转发到具有活动消费者的其他队列。
答案 2 :(得分:1)
我在这里更新我的进度,而不是添加更多评论。我已经使用独立的JMS客户端进行了测试,方法是将JMS提供程序的属性文件从t3://hostA:7001
更改为t3://hostA:7001,hostB:7001
。故障转移由WLS自动处理。没有代码更改。我上面的例外是由使用wlclient.jar引起的,它在更改为wlfullclient.jar后正在工作。
我按照link生成了wlfullclient.jar。
谢谢大家!