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

问题描述

限时删除!!

我想在 IBM MQ 客户端使用 Backout 和 Commit.

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

流程订单

  1. 将 10 条消息放入队列
  2. 从队列中获取 10 条消息并Backout()由于 Backout,我预计队列中存在 10 条消息,但队列中不存在消息.所以我认为 Backout 不能正常工作.为什么?
  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?

平台:.Net Core 2.1

IBM 客户端 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 平台上使用 Backout 和 Commit的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

1403页,肝出来的..

09-07 21:03