首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何从IBM MQ上的put方法获得确认?

如何从IBM MQ上的put方法获得确认?
EN

Stack Overflow用户
提问于 2013-02-26 03:24:31
回答 1查看 2.3K关注 0票数 3

这是我正在使用的示例代码,但是,我不知道如何从put或access queue返回消息发送的响应。

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

PUT方法是一个空的返回类型,如果它是bool,例如,根据返回值- true/false,我可以确认,消息被发送到队列,这就是我的问题,我如何返回确认,以便消息被发送到队列。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-26 07:40:05

根据澄清问题的评论进行更新:

将您的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);
        }
    }

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

上一次回复:

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

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

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

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

在发出PUT之前,请确保对GET执行COMMIT操作,否则永远不会收到回复。

在Infocenter主题中有更多关于这方面的信息,您可以在C:\Program Files (x86)\IBM\WebSphere MQ\tools\dotnet上的默认Windows WMQ客户端安装中找到示例程序。我鼓励您熟悉这些示例,并重用其中的一些代码。如果您实际上没有下载并安装完整的客户端,请在SupportPac MQC75上免费获取一个副本。然后,在安装它时,请确保选择用于安装SDK和示例代码的选项。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15074791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档