我如何在 IBM MQ .on Net Core 平台上使用 Backout 和 Commit [英] How Can I Use Backout and Commit at IBM MQ .on Net Core Platform

查看:24
本文介绍了我如何在 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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆