【问题标题】:Looping over the messages in IBM MQ server在 IBM MQ 服务器中循环消息
【发布时间】:2013-01-02 14:34:37
【问题描述】:

我的 MQ 服务器中有数百条消息(使用 MQ .NET)。

我正在尝试逐一阅读这些内容,但是我在循环阅读时遇到了问题。我没有任何可以在这方面使用的计数/长度属性。

mqQueue - MQ队列 mqQMgr - MQ 队列管理器

   mqQueue = mqQMgr.AccessQueue(queueName, MQC.MQOO_INPUT_AS_Q_DEF + MQC.MQOO_BROWSE);
   mqQueue.Get(mqMsg, mqGetMsgOpts); 
   string readMessage = mqMsg.ReadString(mqMsg.MessageLength);

如何循环遍历队列中的所有消息,如果没有消息我想退出。提前致谢。

【问题讨论】:

    标签: c# .net ibm-mq


    【解决方案1】:

    查看使用 WMQ 代码安装的示例程序。默认情况下,这些将存在于C:\Program Files (x86)\IBM\WebSphere MQ 7.5\tools\dotnet\samples\cs\base\ 中,我认为您想要的是SimpleGet.cs

    您遇到的问题是您重复打开队列。这会将 rowse 指针重置为每个时间的队列头部。示例程序展示了如何打开队列一次,然后循环消息直到达到一定数量或直到队列为空,以先到者为准。

                // create connection
                Console.Write("Connecting to queue manager.. ");
                queueManager = new MQQueueManager(queueManagerName, properties);
                Console.WriteLine("done");
    
                // accessing queue
                Console.Write("Accessing queue " + queueName + ".. ");
                queue = queueManager.AccessQueue(queueName, MQC.MQOO_INPUT_AS_Q_DEF + MQC.MQOO_FAIL_IF_QUIESCING);
                Console.WriteLine("done");
    
                // getting messages continuously
                for (int i = 1; i <= numberOfMsgs; i++)
                {
                    // creating a message object
                    message = new MQMessage();
    
                    try
                    {
                        queue.Get(message);
                        Console.WriteLine("Message " + i + " got = " + message.ReadString(message.MessageLength));
                        message.ClearMessage();
                    }
                    catch (MQException mqe)
                    {
                        if (mqe.ReasonCode == 2033)
                        {
                            Console.WriteLine("No message available");
                            break;
                        }
                        else
                        {
                            Console.WriteLine("MQException caught: {0} - {1}", mqe.ReasonCode, mqe.Message);
                            break;
                        }
                    }
                }
    

    包含代码示例的 IBM 安装媒体可下载为 SupportPac MC75。如果出于某种原因您需要后级客户端,可以从 SupportPacs main page 获得它们。但是,请记住,在以后的版本中有很多工程设计,使用最新版本会更好。任何版本的 MQ 客户端都可以与任何版本的 QMgr 一起使用,但很明显,您获得的功能要么仅在客户端(例如 client.ini 文件),要么在服务器端,无论 QMgr 为您提供什么级别。换句话说,使用带有 v7.0 QMgr 的 V7.5 客户端可以正常工作,但它不会为您提供 CHLAUTH 规则,因为 v7.0 QMgr 没有这些规则。

    【讨论】:

    • 谢谢,numberOfMsgs 的值是如何计算的?
    • 从命令行传入。你有示例代码吗?您需要下载链接吗?
    • 我需要一一获取所有消息,例如我将编写一个方法 GetAllMessages() 并使用它们的消息 ID 逐一读取这些消息,共享链接/快速伪代码请。
    • 我不确定您如何在不安装供应商媒体的情况下安装和注册 .Net DLL,所以我很惊讶您还没有示例。但是,我已经发布了官方安装包的链接。 WMQ 客户端是免费下载的,不过我相信你必须注册才能下载。
    • numberOfMsgs 的值如何:queue.CurrentDepth
    【解决方案2】:

    这是我正在寻找的行,将光标移动到下一条消息,以便我可以阅读下一条消息。

    mGetMsgOpts.Options = MQC.MQGMO_WAIT | MQC.MQGMO_BROWSE_NEXT;

    MQGetMessageOptions:

    queue.Get(message);
    Console.WriteLine("Message " + i + " got = " + message.ReadString(message.MessageLength));
    mGetMsgOpts.Options = MQC.MQGMO_WAIT | MQC.MQGMO_BROWSE_NEXT;
    

    【讨论】:

    • 这不清楚,我认为它不能解决问题。 mGetMsgOpts 永远不会传递给 queue.Get 方法
    猜你喜欢
    • 2010-12-04
    • 2021-08-02
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    • 2019-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多