MQ PCFParameter为Linux和Windows返回不同的值



当使用 IBM PCF 消息来监视队列时,获取输入计数 (MQIA_OPEN_INPUT_COUNT) 的值时,它非常适合安装在 Windows 环境中的 MQ 服务器,但不适用于 Linux。不确定是代码问题还是环境问题。

如果我们连接到 Windows 服务并执行 que 查询,则与 Linux 相比,响应中有更多的参数。

相同的代码,不同的结果。不确定是频道上的配置、权限还是任何其他环境问题。在两个 MQ 服务器上,队列都是本地的。

我试过使用 IBM。WMQ。MQC。MQCMD_INQUIRE_Q_STATUS,没有成功。没有找到任何解决方法来获得MQIA_OPEN_INPUT_COUNT。

PCFMessages文档非常有限,所以我在MQIA_OPEN_INPUT_COUNT文档中没有找到与此问题相关的任何内容: https://www.ibm.com/support/knowledgecenter/en/SSFKSJ_7.5.0/com.ibm.mq.ref.adm.doc/q087810_.htm

知道如何解决这个问题吗?

Public Function GetQtyQConnections(ByVal MQQueueName As String) As Integer
Dim queueManager As IBM.WMQ.MQQueueManager = Nothing
queueManager = New IBM.WMQ.MQQueueManager(AppSettings("MQQueueManagerName"), AppSettings("MQChannelName"), AppSettings("MQConnectionName"))
Dim oPCFMessageAgent As IBM.WMQ.PCF.PCFMessageAgent = New IBM.WMQ.PCF.PCFMessageAgent
oPCFMessageAgent.Connect(queueManager)
Dim pcfMsg As IBM.WMQ.PCF.PCFMessage = New IBM.WMQ.PCF.PCFMessage(IBM.WMQ.MQC.MQCMD_INQUIRE_Q)
pcfMsg.AddParameter(IBM.WMQ.MQC.MQCA_Q_NAME, MQQueueName)
Dim pcfResponse() As IBM.WMQ.PCF.PCFMessage = oPCFMessageAgent.Send(pcfMsg)
Dim pcfResponseLen As Integer = pcfResponse.Length
Dim inputcount As Integer = -1
For i As Integer = 0 To pcfResponseLen - 1
Dim oParams() As IBM.WMQ.PCF.PCFParameter = pcfResponse(i).GetParameters
For Each oParam As IBM.WMQ.PCF.PCFParameter In oParams
Select Case oParam.Parameter
Case IBM.WMQ.MQC.MQIA_OPEN_INPUT_COUNT
inputcount = Integer.Parse(oParam.GetValue())
End Select
Next
Next
Return inputcount
End Function

在视窗上:

---------------
2016-QUEUENAME           
20-1
134--3
2027-2018-03-12  
2028-13.59.40
2019-                                                
22-0
2030-                                                
2029-                                                
2124-                                                
96-0
95-0
98--3
2004-2018-03-12  
2005-13.59.40
3-0
2119-                                                                                                                                
61-0
6-0
5-1
184-1
188-0
4-2
7-1
2013-                                                                
34-0
9-0
8-1
272-2
2008-                                                
17-0
15-5000
13-104857600
123--3
16-0
24-0
78-0
18-0
2012-                                                
10-0
190-0
40-80
41-20
43-0
44-0
42-1
46-0
54-999999999
21-999999999
45-1
23-1
128--3
2023-                                                                
29-1
26-0
28-1
12-0

在 Linux 上:

---------------
2016-QUEUENAME            
20-6
2027-2019-03-11  
2028-17.38.24
2030-                                                
2029-                                                
96-0
95-0
2119-                                                                                                                                
61-1
6-0
5-1
184-1
2013-QUEUEDESCRIPTION
10-0
2017-QUEUEMANAGER                                        
2018-QUEUENAME        
45-1
2024-QUEUEMANAGER

从您的输出中,我可以看到您在 Windows 上查看的队列是本地队列。显示的第二个参数 (20) MQIA_Q_TYPE,其值为 (1) MQQT_LOCAL。

但是,您在 Linux 上查看的队列是远程队列。它MQIA_Q_TYPE (20) 参数的值为 (6) MQQT_REMOTE。

本地队列和远程队列之间存在许多差异,并且它们的属性也有很大不同。尝试使用 runmqsc 并显示一些本地和远程队列以了解差异。这些差异并不是因为平台不同而发生的,只是因为队列类型不同。

您在问题中说,在两个 MQ 服务器上,队列都是本地的,但恐怕这不是您的输出显示的内容。

另外,如果您想使用查询队列命令,请确保您知道 OpenInputCount 和 OpenOutputCount 仅针对本地队列显示,而不是远程队列。

如果您的 Linux 和 Windows 发行版的 IBM MQ 处于相同的版本级别,那么您应该返回相同的响应参数。

你为什么不格式化你的输出,以便普通人可以读? 没有人会知道你所说的 2016 年、2028 年等是什么意思(除了我和其他一些人)

问题:

  1. 您没有为请求指定"状态类型"。 即队列与句柄
  2. 您没有为请求指定任何属性。

看看我在这里发布的 MQListQueueStatus01.java 代码:IBM MQ fetch LGETTIME using Java

最后,为什么不使用 C# 而不是 VB? 你可以简单地使用我发布的所有Java/MQ/PCF代码,因为C#是Java的克隆(可以这么说)。

最新更新