Как я могу использовать Backout и Commit на IBM MQ .on Net Core Platform - PullRequest
1 голос
/ 12 февраля 2020

Я хочу использовать Backout и Commit в 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();

Ответы [ 2 ]

3 голосов
/ 12 февраля 2020

Я бы изменил ваше приложение таким образом.

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

Надеюсь, это помогло.

2 голосов
/ 12 февраля 2020

Вы смешали флаги PMO / GMO с флагами OO (и поместили GMO в PutOpen ...) Флаги GMO должны быть в Get, а не в Open. Аналогично для флагов PMO.

...