jms - 队列管理器的多个监听器

标签 jms ibm-mq mq

一个队列管理器可以有多个监听器吗?到目前为止,我已经使用了一个监听器/队列管理器组合,想知道这是否可行。这是因为我们有 2 个应用程序连接到同一个队列管理器并且似乎有问题。

最佳答案

在 MQ 上下文中,术语 listener 有多种含义。让我们看看是否可以澄清一些术语上的混淆,然后回答与每个术语相关的问题。

按照规范中的定义,JMS listener是一个实现了回调机制的对象。它监听消息的目的地,并在消息到达时调用 onMessage。目的地可能是由任何符合 JMS 的传输提供程序托管的队列或主题。

在 IBM MQ 术语中,listener 是处理服务器上的入站连接请求的进程 (runmqlsr)。尽管它们可以处理多种协议(protocol),但实际上它们几乎都是绑定(bind)端口(默认为 1414)并协商套接字上的连接请求的 TCP 监听器。

TCP 端口
蒂姆的回答适用于其中的第二种情况。 MQ 可以监听多个端口上的套接字,实际上这样做很常见。每个监听器只在一个端口上监听。它可以在所有网络接口(interface)上监听该端口,也可以绑定(bind)到特定网络接口(interface)。但是,没有两个监听器可以绑定(bind)到相同的接口(interface)和端口组合。

在 B2B 环境中,最佳做法是为每个外部业务合作伙伴运行一个专用监听器,以隔离它们跨专用访问路径的每个连接。在内部,我通常为 QMgr-to-QMgr、app-to-QMgr 和交互式用户连接推荐单独的端口。

从这个意义上讲,可以在给定的 QMgr 上运行多个监听器。这些监听器中的每一个都可以接受许多连接。他们的工作是协商连接,然后将套接字交给消息 channel 代理,消息 channel 代理代表远程连接的客户端或 QMgr 与 QMgr 对话。

JMS 监听器
根据评论,Ulab 指的是 JMS 监听器。这些对象建立到队列管理器的连接,然后以 GET 模式等待到达目的地的新消息。消息到达时,它们调用 onMessage 方法,这是一个异步回调例程。

关于“一个队列管理器可以有多个 (JMS) 监听器吗?”这个问题,答案肯定是肯定的。多线程应用程序可以连接多个监听器,可以同时连接多个应用程序实例,并且可以由具有足够可用内存、磁盘和 CPU 的单个队列管理器处理数千个应用程序连接。

当然,这些应用程序中的每一个最终都连接到一个或多个队列,因此问题就变成了它们是否可以连接到同一个队列。

  • 许多监听器可以在同一个队列上监听,只要他们没有独占访问权即可。每个人都会收到一部分到达的消息。
  • QMgr 管理的订阅上的监听器专门附加到动态队列,但同一主题上的多个实例都将收到相同的消息。
  • 如果队列是集群化的并且有多个实例,则需要多个监听器来获取所有消息,因为它们通常会通过 MQ 工作负载分布分布在这些实例上。

关于jms - 队列管理器的多个监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39123237/

相关文章:

java - JMS 消息传递性能 : Lots of Topics/Queues vs. 广泛过滤(消息选择器)

c# - 如何获取 Websphere MQ 连接状态以及如何重置连接 :

java - MQ何时抛出JMS异常 'MQJMS1022: failed to redirect message'?

jms - 使用客户端模式连接到 IBM MQ 时出现 MQJMS2005 异常

java - JMS 动态创建主题

java - 如何确保JMS队列将消息保存在持久存储中而不是堆中?

c++ - 如何将整数错误代码转换为人类可读的字符串?

java - 如果 Java 应用程序连接到 MQ 客户端而不是 MQ 服务器,是否可行?

java - 使用 MDB 的 WebSphere MQ 中的订阅者授权

java - MQ JMS 消息 ID 不返回文本消息以及如何以正确的格式编写 MQ JMSCorrelationID