dev2dev 首页 > 资源中心 > 专家Blog > 专家Blog文章
连接WebLogic域与JMS的注意事项
如果知道一些注意事项的话,将WebLogic域连接到JMS是很容易的。而我们不知道,所以遇到了很多麻烦。
我们的业务需求是使用JMS连接两个独立的WebLogic v8.1域。在本文中,我们假设这两个域的名称是Domain1和Domain2,还有一个名为Bridged.Queue的JMS队列驻留在Domain1上。消息从Domain2发送到Domain1。
我们当时想出了两个实现连接的方案:
- 使用WebLogic的Messaging Bridge
- 使用Foreign JMS Server实用工具将Domain2连接到Domain1。
我们在使用WebLogic的Messaging Bridge时遇到了一个问题:在重启域中的一个服务器后,所需的资源适配器就变成了未部署的,所以我们决定试试Foreign JMS Provider。
Foreign JMS Provider的设置实际上相当简单。假设Bridged.Queue队列已经创建在Domain1中了,其余的配置在Domain2中进行。
首先我们在Domain2中创建一个Foreign JMS Server,它包含Initial Context Factory名称以及一个指向Domain1的URL。假定Domain1有一个包含多于一个的WebLogic server的集群(在host1:7001和host2:7003上),URL类似于t3://host1:7001,host2:7003,其中应该列出所有的主机和端口。如果只列出了一个主机,那么如果该主机发生故障,就会产生单点故障。
接下来要创建Foreign JMSConnection Factory,实际上是绑定到Domain2的JNDI树的javax.jms.QueueConnectionFactory对象。此处需要Domain1的用户名/密码,以及Domain1的JNDI树中的一个有效QueueConnectionFactory的名称。
最后创建Foreign JMSDestination,即绑定到Domain2的JNDI树的javax.jms.Destination对象。Remote JNDI Name是Domain1中Bridged.Queue的完整JNDI名称。
但是,我们遇到了两个相当严重的警告。
第一个是两个域必须互相信任。仅仅在Foreign JMSConnection Factory中输入用户名/密码还不够。两个域必须共享一个不是默认设置的相同凭证。要启用这项功能,在控制台中单击该域,滚动到底部,选择View Domain-wide Security Settings。在Advanced选项卡中取消对Enable Generated Credential的选择,并输入一个凭证。这需要在两个域中执行,并且域中的所有服务器都需要同时重启。如果一个域中的所有服务器不是同时重启的,它们就不会互相信任,而这可能会导致产生严重后果。电子文档中的这篇文章更详细地介绍了这方面的内容。
第二个要求我们花了很长时间才弄明白。两个域正在通信,但是提交消息的尝试却由于事务错误而失败了。由于我的命名标准,我在两个域中都命名了相同的JMS Server和Filestore。这一直没有什么问题,直到在Domain2上驱动该应用程序的MDB(监听一个不同于Bridged.Queue的队列)转过来在Bridged.Queue中放入了一个消息。当它试图提交该事务时,就因奇怪的事务错误而失败了。后来才发现,该事务使用了Domain2中的JMSServer1和Filestore1,然后又试图使用Domain1中的JMSServer1和Filestore1。由于同名,该事务未能使用所需的资源,并回滚了。修复方法是,更改其中一个域中的Filestore和JMS Server的名称。这就是关于命名标准要注意的。
希望本文能对做相同工作的人有所帮助。
原文出处:http://dev2dev.bea.com/blog/unix_r_us/archive/2006/02/connecting_webl_1.html
作者其它文章
|