【问题标题】:WMQ Transactions Rollback using .net explicit Transactions not workingWMQ事务回滚使用.net显式事务不起作用
【发布时间】:2013-11-14 21:03:29
【问题描述】:

我使用 .net C# 代码将消息放入队列并取回消息。我在访问队列和获取消息方面没有问题。现在我想在事务下调用获取消息,并使用显式事务选项来提交和回滚消息。

   try
        {
            MQQueueManager queueManager;

            MQEnvironment.Hostname = hostName;
            MQEnvironment.Channel = channelName;
            MQEnvironment.Port = 1414;
            MQEnvironment.properties.Add(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES);


            queueManager = new MQQueueManager(queueManagerName);


            // obtain a read/write queue reference
            var queue = queueManager.AccessQueue(queueName, MQC.MQOO_INPUT_AS_Q_DEF + MQC.MQOO_INQUIRE + MQC.MQOO_FAIL_IF_QUIESCING);
            IList<string> Messages = new List<string>();

            using (var scope = new CommittableTransaction())
            {
                CommittableTransaction.Current = scope; 
                var message = new MQMessage();

                try
                {
                    var getMessageOptions = new MQGetMessageOptions();
                   getMessageOptions.Options += MQC.MQGMO_SYNCPOINT ;
                    int i = queue.CurrentDepth;
                    queue.Get(message,getMessageOptions);                        
                    Console.WriteLine(message.ReadString(message.MessageLength));
                    scope.Rollback();
                }
                catch (MQException mqe)
                {
                    if (mqe.ReasonCode == 2033)
                    {
                        Console.WriteLine("No more message available");
                        Console.ReadLine();
                        scope.Rollback();
                    }
                    else
                    {
                        Console.WriteLine("MQException caught: {0} - {1}", mqe.ReasonCode, mqe.Message);
                        Console.ReadLine();
                        scope.Rollback();
                    }
                }
                CommittableTransaction.Current = null;
            }


            // closing queue

            queue.Close();


            // disconnecting queue manager

            queueManager.Disconnect();
            Console.ReadLine();

        }

        catch (MQException mqe)
        {
            Console.WriteLine("");
            Console.WriteLine("MQException caught: {0} - {1}", mqe.ReasonCode, mqe.Message);
            Console.WriteLine(mqe.StackTrace);
            Console.ReadLine();
        }

我遇到的第一个问题是,与访问System.Dotnet.XARecovery 队列有关。即使我有权访问队列以从队列中获取消息,但由于调用以下行时恢复队列的访问权限,程序开始失败。

queue.Get(messages),

然后我获得了恢复队列的访问权限,访问被拒绝问题得到解决。现在从队列中获取消息后,在调用scope.RollBack() 后消息不会回滚。

我检查了System.Dotnet.XARecovery 队列和死信队列,那里也没有任何内容。

为什么我在 WMQ 消息队列中看不到回滚的消息。

【问题讨论】:

    标签: c#-4.0 message-queue ibm-mq rollback


    【解决方案1】:

    queue.Get(message); 之后有一个scope.Commit(); 在收到消息后,您明确地调用了提交。如果 Get 成功,则 Commit 调用告诉队列管理器从队列中删除消息。所以消息不会被回滚。

    编辑:您的代码中缺少 GMO_SYNCPOINT 选项。你需要有这样的东西

            MQGetMessageOptions getMessageOptions = new MQGetMessageOptions();
            getMessageOptions.Options += MQC.MQGMO_SYNCPOINT;
            queue.Get(message, getMessageOptions);
    

    【讨论】:

    • 感谢沙市的回复。我知道 get 是否成功,范围会被提交。问题是当 get 有一些错误或者当我调用 Rollback 而不是 commit 时。消息不会在队列中回滚。
    • 我尝试使用下面提到的选项。 MQGetMessageOptions getMessageOptions = new MQGetMessageOptions(); getMessageOptions.Options += MQC.MQGMO_SYNCPOINT;除了第一次,其余所有时间 Queue.Get(message, getMessageOptions) 清除队列中的消息,即使事务回滚。
    • 阿曼,我的一位同事运行了您的代码,他确认代码运行良好。每次回滚后消息都会重新出现。在调用 Rollback 后,您如何检查队列中不存在的消息?您是在调试代码时检查队列深度还是在程序结束后检查?
    • 我已经尝试检查队列深度以及在程序结束后查看 websphere 队列。回滚后的队列深度没有显示任何回滚迹象,WMQ 队列浏览器也没有。我现在确信在我的程序中没有什么可以做的,以使其适用于基于事务的 WMQ 访问。我不确定服务器 WMQ 服务器设置。是否有任何指南或步骤涉及设置队列以启用基于事务的操作?
    • 我认为向 IBM 提出问题以解决这个问题是个好主意,因为我们没有看到与您看到的相同的问题。 IBM 服务可以分析并确定问题所在。
    【解决方案2】:

    我找到了解决问题的方法。在我上面的代码中,如果我从

    更改行
    MQEnvironment.properties.Add(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES);
    

    MQEnvironment.properties.Add(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES_MANAGED);
    

    然后它开始注册本地 DTC 的事务,并在回滚或提交队列上的消息时正常工作。

    【讨论】:

      猜你喜欢
      • 2011-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-23
      • 2015-07-14
      • 2018-05-01
      • 2017-07-18
      相关资源
      最近更新 更多