【问题标题】:MQ PCFParameter returning different values for Linux and WindowsMQ PCFParameter 为 Linux 和 Windows 返回不同的值
【发布时间】:2019-07-26 07:07:07
【问题描述】:

当使用 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

在 Windows 上:

---------------
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

【问题讨论】:

    标签: vb.net ibm-mq


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      问题:

      1. 您没有为请求指定“状态类型”。即 QUEUE 与 HANDLE
      2. 您没有为请求指定任何属性。

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

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

      【讨论】:

      • .Net PCF 类未记录为受支持的接口。它们可能有效,也可能无效……但我当然不会相信它们与 Java 类一样是最新的(或者用其他语言手工完成)。
      猜你喜欢
      • 1970-01-01
      • 2015-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多