确定访问我们本地队列的远程 MQ 队列管理器
Posted
技术标签:
【中文标题】确定访问我们本地队列的远程 MQ 队列管理器【英文标题】:Determine the remote MQ queue manager accessing our local queue 【发布时间】:2018-12-28 10:52:26 【问题描述】:我正在尝试编写一个脚本,当传递一个 MQ 队列名称时,该脚本将指示队列的“结束”,即谁放置消息以及谁取下它们。
为了建立执行此操作的手动方法(在自动化之前),我随机选择了一个 QLOCAL 并使用 CA-Sysview,我使用 MQROBJ 屏幕查看我们的一个 CICS 区域 PUTs 消息在队列和我们的 MQ CHIN 启动任务 GETs 消息离开队列。
但我看不到消息的去向。由于这是一个 QLOCAL,但它是 CHIN 作业从它那里取出消息,所以我假设一些远程队列管理器将此队列定义为 QREMOTE 并针对该队列发出 GET。
我们可以访问普通的 z/OS MQ 命令和 CA-Sysview
我可以建立远程队列管理器从队列中取出消息吗?
【问题讨论】:
我不认为你可以。很好奇有没有办法。 @SaggingRufus 我的解释是否正确?我发现的所有关于使用远程队列的 IBM 文档和图表 管理人员都在谈论远程队列和触发。将消息放入本地队列并等待来自远程 QMGR 的 GET 似乎没有被讨论过。 你描述的基本上是我在工作的地方看到的东西。有 2 个队列,因此如果您是其中一个放置消息的人,您将有一个名为 XXX_TO_YYY 的队列,并且您可能正在使用一个名为 MQX1 的队列管理器。这将是您的本地队列。当我去获取这些消息时,我会调用一个名为 YYY_FR_XXX 的队列,它可能正在使用一个名为 MQY1 的队列管理器。在这种情况下,我发出 GET 的队列对我来说是本地的,而你发出 PUT 的队列对你来说是本地的,但你的队列对我来说是远程的,而我的队列对你来说是远程的。 在这种类型的设置中,我不知道是否可以识别远程队列或管理器,因为这都是在 MQS 配置中设置的(至少据我所知)。 【参考方案1】:为了确定队列使用图的任一端,请在您的 QLOCAL 上尝试以下命令。
DISPLAY CONN(*) TYPE(ALL) ALL WHERE(OBJNAME EQ local-q-name)
并查找以下字段; APPLTYPE
、APPLTAG
、OPENOPTS
、CHANNEL
、CONNAME
您可以通过查看输出中的OPENOPTS
字段来判断应用程序是推杆还是吸气器。如果上面写着MQOO_OUTPUT
,那么它就是一个推杆,如果上面写着MQOO_INPUT_*
,那么它就是一个吸气剂。
如果应用程序填写了CHANNEL
名称,则使用该队列的连接会进入通道。您必须前往CONNAME
描述的机器并从那里进一步调查。您应该能够通过使用通道名称来区分客户端应用程序和发送方/接收方通道。
如果您正在通过发送方/接收方通道跟踪路径,则必须在远程计算机上查看 QREMOTE 定义。尝试如下命令:-
DISPLAY QREMOTE(*) ALL WHERE(RNAME EQ local-q-name)
【讨论】:
莫拉格 - 谢谢。命令响应是 MPO1 DISPLAY CONN(*) TYPE(ALL) ALL WHERE(OBJNAME EQ PPDAA1.APLUS.DRS.AUTOCASE.UPD) CSQM297I MPO1 CSQMDRTC NO CONN FOUND MATCHING REQUEST CRITERIA。如果我查看“对象的 MQ 请求”;在 Sysvies 中显示(Sorrtty - 我不知道等效的 z/OS 命令)针对该队列的唯一连接类型是 CICS(用于 PUT)和 CHIN(用于 GET); 不幸的是,我不知道是否涉及任何远程机器。我正在尝试找出是否有。 连续多次尝试DIS CONN
命令。有时您会发现编写的客户端应用程序连接、获取、断开连接、重复。在 unix 上,我可以在 while true 循环中运行显示并通常捕获它,但不确定如何在 zOS 上执行相同操作。
@JoshMc thnks Josh - 尝试过但从未成功。
您可以获得的另一个详细信息是最后放置和获取时间。队列上的设置是MONQ
。可以设置为QMGR
,表示取QMGR MONQ
设置的值,也可以设置为OFF
,关闭特定队列的收集,也可以设置为LOW/MEDIUM/HIGH
,在知识中心的话“这里没有LOW、MEDIUM和HIGH值之间的区别。这些值都打开了数据收集,但不影响收集率。”【参考方案2】:
远程队列管理器不会“从队列中取出消息”。这简直是不可能的。既然您提到了 z/OS,那么有些模式可能会涉及到共享队列,但这更像是一个不同的本地 qmgr,而不是远程的。
如果本地 CHIN 定义为传输队列 (USAGE=XMITQ) 并且存在关联通道,则本地 CHIN 将从队列中取出消息以将其发送到远程队列管理器。到那时你就知道远程 qmgr 是什么了。
如果队列不是传输队列,则涉及通道的唯一方法是是否有一个 CLIENT 应用程序连接到您的队列管理器。然后,查看 QSTATUS 和 CHSTATUS 应该会提供有关工作内容的信息。
更一般地说,有 有 种方法可以计算出消息通过 MQ 网络的路径 - 研究 dspmqrte 命令。即使它不是 MQ on z/OS 产品的一部分,您也可以从另一个平台将其作为客户端应用程序运行。
【讨论】:
马克 - 你是说你不能针对 QREMOTE 发出 GET 吗?这似乎是一个正常的 QLOCAL - 不是 XMITQ,也没有定义 INITQ 或 PROCESS。我看不到 CHSTATUS 将如何提供帮助,因为我不知道涉及哪个频道。 .如果我为此队列发出 QSTATUS,我会看到什么指示消息的去向?以上是关于确定访问我们本地队列的远程 MQ 队列管理器的主要内容,如果未能解决你的问题,请参考以下文章