【问题标题】:How to get acknowledgement back from put method on IBM MQ?如何从 IBM MQ 上的 put 方法返回确认?
【发布时间】:2013-02-11 01:24:02
【问题描述】:

这是我正在使用的示例代码,但是,我不知道如何从放置或访问队列中获取响应,即消息已发送。

 mqQueue = mqQMgr.AccessQueue("Queue Name", MQC.MQOO_OUTPUT |
 MQC.MQOO_INPUT_SHARED |       MQC.MQOO_INQUIRE); 
 mqQueue.Put(mqMsg, mqPutMsgOpts);

PUT 方法是一个 void 返回类型,如果它是 bool,例如,基于返回值 - true/false,我可以确认,消息已发送到队列,这就是我的问题,我该怎么做取回确认,以便将消息发送到队列。

任何输入都会非常有帮助。

【问题讨论】:

    标签: c# .net ibm-mq


    【解决方案1】:

    根据 cmets 更新澄清问题:

    将您的PUT 包含在一个try 块中并捕获MQException。如果没有MQException 被抛出,那么PUT 工作并且你得到了RC=0。例如,这是来自示例PUT 程序:

        void PutMessages()
        {
            try
            {
                // mq properties
                properties = new Hashtable();
                properties.Add(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES_MANAGED);
                properties.Add(MQC.HOST_NAME_PROPERTY, hostName);
                properties.Add(MQC.PORT_PROPERTY, port);
                properties.Add(MQC.CHANNEL_PROPERTY, channelName);
    
                // display all details
                Console.WriteLine("MQ Parameters");
                Console.WriteLine("1) queueName = " + queueName);
                Console.WriteLine("2) host = " + hostName);
                Console.WriteLine("3) port = " + port);
                Console.WriteLine("4) channel = " + channelName);
                Console.WriteLine("5) numberOfMsgs = " + numberOfMsgs);
                Console.WriteLine("");
    
                // 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_OUTPUT + MQC.MQOO_FAIL_IF_QUIESCING);
                Console.WriteLine("done");
    
                // creating a message object
                message = new MQMessage();
                message.WriteString(messageString);
    
                // putting messages continuously
                for (int i = 1; i <= numberOfMsgs; i++)
                {
                    Console.Write("Message " + i + " <" + messageString + ">.. ");
                    queue.Put(message);
                    Console.WriteLine("put");
                }
    
                // closing queue
                Console.Write("Closing queue.. ");
                queue.Close();
                Console.WriteLine("done");
    
                // disconnecting queue manager
                Console.Write("Disconnecting queue manager.. ");
                queueManager.Disconnect();
                Console.WriteLine("done");
            }
    
            catch (MQException mqe)
            {
                Console.WriteLine("");
                Console.WriteLine("MQException caught: {0} - {1}", mqe.ReasonCode, mqe.Message);
                Console.WriteLine(mqe.StackTrace);
            }
        }
    

    如前所述,这是来自示例代码,一个用于生产的真实程序可能会有更精细的异常处理。也就是说,API 调用要么成功,要么抛出MQException。确切的行为取决于您的选择。例如,如果您在 GET 上请求消息转换,则可能会出现转换错误,而作为二进制有效负载检索到的完全相同的消息会成功。


    之前的回复:

    我不确定我是否理解这个问题,但我认为您要问的是如何使用 WebSphere MQ 设计请求/回复程序,这就是我将如何回应的方式。但是,如果您所说的“回复”实际上是指PUT 的原因和返回代码,请澄清问题,我会更新我的答案。

    请求/响应的通常模式是请求程序首先打开回复队列。如果打开的队列的名称是模型队列,则队列管理器创建一个动态队列并返回一个句柄。否则,队列必须是预先存在的本地队列。

    一旦应用程序获得了回复队列的句柄,它就会打开请求队列并创建新的请求消息。本地回复队列的名称用于初始化请求消息的replyToQueue 字段。本地队列管理器名称会自动填充到消息的replyToQMgr 字段中。然后应用程序将消息放入回复队列中并等待回复。

    如果有多个应用程序实例侦听同一个回复队列,它们通常会为所需的特定消息指定相关 ID。通常的设计是读取请求消息的服务器将MQMD.MsgID 放入回复消息的MQMD.CorrelID 字段中,但有时它会将传入消息 ID 传输到出站消息 ID。

    在发出GET 之前,请确保COMMIT PUT,否则您将永远收到回复。

    在信息中心主题Design of the Request sample program 中有更多相关信息,您可以在默认的 Windows WMQ 客户端安装中的C:\Program Files (x86)\IBM\WebSphere MQ\tools\dotnet 找到示例程序。我鼓励您熟悉这些示例并重用其中的一些代码。如果您实际上没有下载并安装完整的客户端,请在SupportPac MQC75 获取免费副本。那么安装的时候一定要选择安装SDK和示例代码的选项。

    【讨论】:

    • 谢谢。 PUT 方法是一个 void 返回类型,例如,如果它是 bool,基于返回值 - true/false,我可以确认,消息已发送到队列,这就是我的问题,我如何取回确认,以便将消息发送到队列。
    【解决方案2】:

    我如何取回确认信息,以便将消息发送到 排队

    如果 Put 方法没有抛出异常,那么这就是您确认 MQ 已将消息放入队列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-12
      • 1970-01-01
      • 2018-11-16
      • 1970-01-01
      • 2016-05-15
      • 1970-01-01
      • 2019-08-10
      • 1970-01-01
      相关资源
      最近更新 更多