当使用 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 年等是什么意思(除了我和其他一些人)
问题:
- 您没有为请求指定"状态类型"。 即队列与句柄
- 您没有为请求指定任何属性。
看看我在这里发布的 MQListQueueStatus01.java 代码:IBM MQ fetch LGETTIME using Java
最后,为什么不使用 C# 而不是 VB? 你可以简单地使用我发布的所有Java/MQ/PCF代码,因为C#是Java的克隆(可以这么说)。