【问题标题】:more than one listener for the queue manager队列管理器的多个侦听器
【发布时间】:2016-12-31 14:01:57
【问题描述】:

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

【问题讨论】:

  • 不幸的是,这个问题太模糊了,无法明确回答。而不是说“我们有 2 个应用程序连接到同一个队列管理器,并且似乎有问题告诉我们问题是什么,详细,并提供证据,例如屏幕截图、堆栈跟踪、日志条目等。如果这是在任何更流行的标签上,它会在几分钟内关闭。请参阅:How do I ask a good question.

标签: jms ibm-mq mq


【解决方案1】:

是的,您可以根据需要创建任意数量的侦听器:

http://www.ibm.com/support/knowledgecenter/SSFKSJ_9.0.0/com.ibm.mq.explorer.doc/e_listener.htm

但是,两个应用程序没有理由不能通过同一个侦听器(在同一个端口上)连接到队列管理器。你遇到了什么问题?

【讨论】:

  • 他们显然都在消费同一个队列,如果其他人成功消费它,就会超时。
  • 没关系。您确定一个应用程序没有使用所有消息,而第二个应用程序没有任何消息可以使用吗?
  • 通常你会有不同的应用程序使用不同的队列。您可能有同一个应用程序的多个实例使用一个队列,但您希望不相关的应用程序使用它们自己的队列。
  • 是的,我同意。它是实际消费者的模拟消费者应用程序,它们都部署在同一台服务器上导致问题。
  • 好的。所以不同的听众无济于事。它们需要位于不同的队列管理器或同一队列管理器的不同队列中。
【解决方案2】:

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

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

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

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

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

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

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

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

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

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

【讨论】:

  • 谢谢罗伯。因此,如果在同一个 JBOSS 服务器中部署了 2 个应用程序(具有类似的 JMS 侦听器配置),它们中的一个会消耗它的一部分还是两者都获得它的一部分?
  • 取决于消息到达的速度以及它们的处理速度。当应用程序发出GET 时,MQ 通过将句柄推入堆栈来表示该GET。第一条消息转到注册 GET 的最后一件事。如果该事物在新消息到达之前完成处理并发出下一个 GET,它将获得下一条消息。如果消息到达的速度超过了它们的处理速度,它们将被交给队列中带有 GET 句柄的下一件事。
猜你喜欢
  • 2018-04-08
  • 2013-09-24
  • 1970-01-01
  • 2021-10-09
  • 1970-01-01
  • 2017-10-29
  • 1970-01-01
  • 2011-09-15
  • 2013-06-16
相关资源
最近更新 更多