断开与QueueManager

时间:2016-03-24 07:57:43

标签: .net ibm-mq mq

当从QueueManager断开连接时,我收到错误代码为2195的MQException。我无法找到原因。我怎样才能找出这个例外的原因?

我的代码看起来像这样。最后一行是抛出异常。

        MQQueueManager qMgr = null;
        MQQueue fromQueue = null;

        try
        {
            // mq properties
            Hashtable properties = new Hashtable();
            properties.Add(MQC.HOST_NAME_PROPERTY, _config.HostName);
            properties.Add(MQC.PORT_PROPERTY, _config.Port);
            properties.Add(MQC.CHANNEL_PROPERTY, _config.ChannelName);
            // managed mode
            properties.Add(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES_MANAGED);

            // create connection
            qMgr = new MQQueueManager(_config.QueueManagerName, properties);
            fromQueue = qMgr.AccessQueue(_config.QueueName, MQC.MQOO_INPUT_AS_Q_DEF + MQC.MQOO_FAIL_IF_QUIESCING);

            MQGetMessageOptions gmo = new MQGetMessageOptions();
            gmo.Options = MQC.MQGMO_SYNCPOINT | MQC.MQGMO_FAIL_IF_QUIESCING | MQC.MQGMO_WAIT;
            gmo.WaitInterval = Convert.ToInt32(timeout.TotalMilliseconds % Int32.MaxValue);

            try
            {
                MQMessage message = new MQMessage();
                fromQueue.Get(message, gmo);       //wait for message

                if (message != null && message.MessageLength > 0)
                {
                    string strMsg = message.ReadString(message.MessageLength);
                    ret = true;
                }
            }
            catch (MQException ex)
            {
                if (ex.ReasonCode != MQC.MQRC_NO_MSG_AVAILABLE)                      
                {
                    throw;
                }
            }
        }
        finally
        {
            try
            {
                if (fromQueue != null)
                    fromQueue.Close();
                if (qMgr != null)
                    if(qMgr.IsConnected)
                        qMgr.Disconnect(); 

1 个答案:

答案 0 :(得分:0)

  

MQC.MQGMO_SYNCPOINT

您正在创建本地UOW(工作单元),但您从不提交或撤销交易。现在,对于正常的断开连接(与异常或崩溃),MQ假设自动提交消息。但是你永远不应该回答MQ为你做的工作。

我建议你使用MQC.MQGMO_NO_SYNCPOINT,除非你真的想要在UOW中检索消息,但是你需要添加提交或回调调用。

  

如果(qMgr.IsConnected)

这种方法调用毫无意义。所有这一切都是看最后一个电话的CC& RC值来确定是返回true还是false。它实际上并没有测试连接。正如我所说,毫无意义。