How Can I Use Backout and Commit at IBM MQ .on Net Core Platform

為{幸葍}努か 提交于 2020-02-25 05:16:07

问题


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

Process Order

  1. Put 10 messages to queue
  2. Get 10 messages from queue and Backout() I expect 10 messages exist in the queue because of Backout, but there is no messages exist in the queue. So I think Backout does not work properly. Why?

Platform: .Net Core 2.1

IBM Client DLL: amqmdnetstd.dll v 9.1.2

Code

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


回答1:


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

Hope this helped.




回答2:


You've mixed PMO/GMO flags with OO flags (and put GMO on the PutOpen ...) GMO flags need to be on the Get, not the Open. Similarly for PMO flags.



来源:https://stackoverflow.com/questions/60190371/how-can-i-use-backout-and-commit-at-ibm-mq-on-net-core-platform

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!