本文介绍了如何在IBM MQ .on Net Core Platform上使用回退和提交的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在IBM MQ Client上使用Backout and Commit。

I want to use Backout and Commit at IBM MQ Client.

流程订单


  1. 将10条消息放入队列

  2. 从队列中获取10条消息并 Backout()
    我希望队列中存在10条消息,原因是回退,但是队列中没有消息。因此,我认为Backout无法正常工作。为什么?

平台:.Net Core 2.1

IBM Client DLL:amqmdnetstd.dll v 9.1.2

代码

string hostName = "TX32";
int port = 5566;
string channelName = "TESTTRY";
string queueName = "TESTTRY";
int numberOfMsgs = 10;
string queueManagerName = "DMQ1";
int queueOpenOptionsForPut =  MQC.MQOO_OUTPUT + MQC.MQGMO_SYNCPOINT + MQC.MQOO_FAIL_IF_QUIESCING;
int queueOpenOptionsForGet =  MQC.MQGMO_SYNCPOINT + MQC.MQOO_FAIL_IF_QUIESCING;
string messageString = "Bunyamin Test";
MQQueue queue;

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

// PUT MESSAGES
var queueManager = new MQQueueManager(queueManagerName, properties);
queue = queueManager.AccessQueue(queueName, queueOpenOptionsForPut);
var message = new MQMessage();
message.WriteString(messageString);

// putting messages continuously
for (var i = 1; i <= numberOfMsgs; i++)
{
   System.Console.Write("Message " + i + " <" + messageString + ">.. ");
   queue.Put(message);
   System.Console.WriteLine("put");
}

queue.Close();
queueManager.Disconnect();

//GET MESSAGES
queueManager = new MQQueueManager(queueManagerName, properties);
queue = queueManager.AccessQueue(queueName, queueOpenOptionsForGet);

 for (var i = 1; i <= numberOfMsgs; i++)
 {
   // creating a message object
   message = new MQMessage();
   queue.Get(message);
   System.Console.WriteLine(i + " .Message " + i + " got = " + 
   message.ReadString(message.MessageLength));
   queueManager.Backout(); //I EXPECT 10 MESSAGES SHOULD GO BACK TO QUEUE?
   message.ClearMessage();
}

queue.Close();
queueManager.Disconnect();


推荐答案

我会以这种方式修改您的应用程序

I would modify your application this way.

void testCommitBackout()
        {
            string hostName = "localhost";
            int port = 1414;
            string channelName = "SVRCONN_CHN";
            string queueName = "QU1";
            int numberOfMsgs = 10;
            string queueManagerName = "QM1";
            int queueOpenOptionsForPut = MQC.MQOO_OUTPUT + MQC.MQOO_FAIL_IF_QUIESCING;
            int queueOpenOptionsForGet = MQC.MQOO_INPUT_AS_Q_DEF + MQC.MQOO_FAIL_IF_QUIESCING;
            string messageString = "Bunyamin Test";
            MQQueue queue;

        Hashtable 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);
        properties.Add(MQC.USER_ID_PROPERTY, "myuserid");
        properties.Add(MQC.PASSWORD_PROPERTY, "Mylongpassword");

        // PUT MESSAGES
        var queueManager = new MQQueueManager(queueManagerName, properties);
        queue = queueManager.AccessQueue(queueName, queueOpenOptionsForPut);

        // putting messages continuously under a syncpoint and commit after that
        for (var i = 1; i <= numberOfMsgs; i++)
        {
            var mqpmo = new MQPutMessageOptions();
            mqpmo.Options |= MQC.MQPMO_SYNCPOINT;
            var message = new MQMessage();
            message.WriteString(messageString);
            System.Console.Write("Message " + i + " <" + messageString + ">.. ");
            queue.Put(message, mqpmo);
            System.Console.WriteLine("put");
        }
        // Now commit all 10 messages.
        queueManager.Commit();

        queue.Close();
        queueManager.Disconnect();

        //GET MESSAGES
        queueManager = new MQQueueManager(queueManagerName, properties);
        queue = queueManager.AccessQueue(queueName, queueOpenOptionsForGet);

        // Get messages under syncpoint 
        for (var i = 1; i <= numberOfMsgs; i++)
        {
            // creating a message object
            var message = new MQMessage();
            var gmo = new MQGetMessageOptions();
            gmo.Options |= MQC.MQGMO_SYNCPOINT;
            queue.Get(message, gmo);
            System.Console.WriteLine(i + " .Message " + i + " got = " +
            message.ReadString(message.MessageLength));
            message.ClearMessage();
        }
        // Backout all messages.
        queueManager.Backout(); //I EXPECT 10 MESSAGES SHOULD GO BACK TO QUEUE?

        queue.Close();
        queueManager.Disconnect();
    }

希望有帮助。

这篇关于如何在IBM MQ .on Net Core Platform上使用回退和提交的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-24 09:39