3

当前使用 WebLogic 和分布式队列。而且我从文档中知道分布式队列允许您使用全局 JNDI 名称检索到集群中任何队列的连接。似乎分布式队列为您提供的主要功能之一是跨多个托管服务器的负载平衡连接。所以我们有 4 个托管服务器(每个物理服务器上两个,通过多播进行通信),每个托管服务器都有一个单独的 JMS 服务器,该服务器配置为它自己的数据存储。

我有 99% 的把握我已经知道这个问题的答案,但似乎如果你想从队列中消费一条消息,并且集群中的每个 Mgd 服务器上都存在队列,那么从技术上讲,你不能关闭一条消息任何队列(您只能将消息从您连接到的队列中拉出)。因此,如果我在 Mgd Server 4 上有一条消息,并且我连接到 Mgd Server 1,我将看不到来自 Mgd Server 4 的队列中的消息。

那么在 Java EE 或 WLS 中是否有一种方法可以使用来自队列的所有节点(跨集群)的消息。就像查看每个 Mgd 服务器上的每个队列实例一样?事实并非如此,并且文档看起来似乎是不可能的,以及这个视频(大约 5 分钟):

http://www.youtube.com/watch?v=HAKixK_wp0Q

4

2 回答 2

3

不,当您的客户端连接到同一集群的另一台托管服务器时,您不能使用传递到一个托管服务器的消息。

这是它的工作原理。使用 UDT 时,wls 提供了一个 JNDI 名称,该名称在内部解析为每个托管服务器的 4 个不同的 JNDI 名称,每个托管服务器上的 JMS 服务器都是不同的。当您在发布消息时使用 UDQ JNDI 名称时,它会使用您选择的算法和在您的连接工厂中完成的其他配置到达 4 个托管服务器之一。

当消息使用者侦听 UDQ 时,它被固定到其中一个托管服务器上的 JMS 服务器。它对其他服务器中的消息没有可见性。

通常 UDQ 用于您希望消息由多个托管服务器同时使用的场景。您通常会将 MDB 部署到集群,这意味着 MDB 将部署到每个托管服务器,并且每个托管服务器都能够使用来自其本地 JMS 服务器的消息。

于 2013-02-21T17:53:34.277 回答
0

如果您的消息存储配置为使用数据库,我相信您可以。如果是这样,那么我认为从队列中删除一个项目会将其从共享数据库表中删除。即所有JMS 服务器都指向同一个数据库实例和表。这也应该很容易测试。

于 2013-02-21T00:46:20.590 回答