在不依赖异常的情况下在IBM MQ上接收消息(基于示例代码)

时间:2018-06-21 16:10:11

标签: ibm-mq

我们正在IBM MQ上接收消息(使用C#和IBM WebSphere MQ 8.0.0.7 NuGet包)。

我们发现的所有接收消息的例子都是简单的,并且基于以下模式:

  • 接收消息
  • 如果没有消息,则引发异常
  • 继续接受

原理是“听”和“接收”不同。

鉴于这是一个简洁的队列,当我正在“侦听”的队列中没有可用的队列时,肯定有更好的方法来侦听队列,而不是坐在由捕获异常控制的循环中接收。

这是主要的代码/模式:

   public void Start(string receiveQueueName)
    {
        _receiveQueueName = receiveQueueName;
        _thread=new Thread(ReceiveText);
        _thread.Start();
    }

    private void ReceiveText()
    {
        try
        {
            string responseText = null;
            // First define a WebSphere MQ message buffer to receive the message
            MQMessage retrievedMessage = new MQMessage();

            // Set the get message options
            MQGetMessageOptions gmo = new MQGetMessageOptions(); //accept the defaults
            //same as MQGMO_DEFAULT

            // Set up the options on the queue we want to open
            int responseOptions = MQC.MQOO_INPUT_AS_Q_DEF;

            using (MQQueue responseQueue =
                _mqQueueManager.AccessQueue(receiveQueueName, responseOptions)) 
            {

                while (isEnabled)
                {
                    // creating a message object
                    MQMessage mqMessage = new MQMessage();

                    try
                    {
                        responseQueue.Get(mqMessage);

                        // ---- DEAL WITH THE MESSAGE ----

                        mqMessage.ClearMessage();
                    }
                    catch (MQException mqe)
                    {
                        if (mqe.ReasonCode == 2033)
                        {

                            // ----- NO MESSAGE ------

                            continue;
                        }
                        else
                        {
                            throw;
                        }
                    }
                }

                // Close the queue
                responseQueue.Close();
            }

        }
        catch (MQException mqExOuter)
        {
            // ----- DEAL WITH THE ERROR -----
        }

    }

请注意,这里还有其他支持线程的代码,为清楚起见已将其删除。


我接受这是一个“主观”等问题,但是请考虑我对人们的专业知识很有吸引力,这对后来的读者来说是有效且重要的。

0 个答案:

没有答案