【问题标题】:MQ error 2195 when disconnecting from QueueManager与 QueueManager 断开连接时出现 MQ 错误 2195
【发布时间】:2016-03-24 07:57:43
【问题描述】:

从 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(); 

【问题讨论】:

  • 您有任何 FDC 文件吗?您使用的是哪个版本的 MQ?
  • 我不知道任何 FDC 文件。那些是干什么用的?服务器版本为7.5,客户端版本为8.0.0.4。
  • *.FDC 文件由 MQ 编写,用于记录错误并转储有关 MQ 遇到错误时发生的情况的信息。它们可用于解决问题。

标签: .net ibm-mq mq


【解决方案1】:

MQC.MQGMO_SYNCPOINT

您正在创建本地 UOW(工作单元),但您从未提交或退出事务。现在,对于正常断开连接(相对于异常或崩溃),MQ 应该自动提交消息。但是你永远不应该回复 MQ 为你做你的工作。

我建议您使用 MQC.MQGMO_NO_SYNCPOINT,除非您确实希望在 UOW 中检索消息,但您需要添加提交或回退调用。

如果(qMgr.IsConnected)

这个方法调用毫无意义。它所做的只是查看最后一次调用的 CC 和 RC 值来确定是返回 true 还是 false。它实际上并不测试连接。正如我所说,毫无意义。

【讨论】:

  • 谢谢。我的代码是从 TransactionScope 内部调用的。我希望消息的检索和对数据库的写入在同一个事务中。即使我在 TransactionScope 中,是否也必须显式调用提交或回滚?
猜你喜欢
  • 2014-07-04
  • 1970-01-01
  • 2015-05-12
  • 2011-07-03
  • 1970-01-01
  • 2020-04-23
  • 1970-01-01
  • 2013-04-06
  • 1970-01-01
相关资源
最近更新 更多