Сделать обновление WebSphere MQ Queue атомарным

Я пишу в очередь IBM WebSphere MQ, используя задачу SSIS Script, написанную на C #. На данный момент мы используем пару простых циклов, чтобы собрать необходимую нам информацию в объект Dictionary, а затем поместить элементы один за другим в очередь. Однако сейчас мы извлекаем данные из базы данных SQL, и мне нужно сделать эти обновления атомарными.

Вот код, используемый для добавления информации в словарь.

   //add to list so we can weed out the duplicates
   if (!qContents.ContainsKey(retrievedMessage.Substring(0, 13)))
   {
        qContents.Add(retrievedMessage.Substring(0, 13), retrievedMessage);
   }

И вот здесь они добавляются в очередь. Метод MqPut используется для отправки каждого элемента в очередь отдельно.

   //write out unique agent ids to consolidated queue
   foreach (string agentItem in qContents.Values)
   {
        MqPut(agentItem, _outputQueue);
   }

Весь блок кода заключен в блок try / catch / finally, поэтому я уверен, что мне придется как-то его использовать, однако я новичок в WebSphere MQ и не знаю, как это сделать. Спасибо!

ИЗМЕНИТЬ Использование кода из приведенного ниже ответа вызывает исключение. Как только программа переходит к методу "put" объекта MQMessage, генерируется исключение MQ "MQRC_FUNCTION_NOT_SUPPORTED". Это _COMPlusExceptionCode = -532459699


person NealR    schedule 13.08.2012    source источник


Ответы (1)


Мое предложение вам:

  1. Прочтите немного о Messaging, а затем о WebSphere MQ.
  2. Посмотрите примеры WebSphere MQ C # (находятся в папке <mq_installation>\tools\dotnet\samples\cs\base).
  3. Напишите несколько образцов, чтобы вам было удобно.

Чтобы сделать его атомарным, вы можете использовать функцию транзакции XA в WebSphere MQ. По сути, вам нужно заключить свою работу в область транзакции. Пример псевдофрагмента.

// Open queue
MQQueue q = MQQueueManager.AccessQueue( ...);

using (CommittableTransaction transScope = new CommittableTransaction())
{
      CommittableTransaction.Current = transScope;

      try
      {
          MQMessage mqMsg = new MQMessage();

          // Add message contents
          mqMsg.Write(<data>);
          q.Put(mqMsg);

          transScope.Commit();
      }
      catch (Exception ex)
      {
           transScope.Rollback();
           Console.Write(ex);
      }
      CommittableTransaction.Current = null;
    }

Кстати, мне интересно узнать о методе MqPut? Это ваш собственный метод или предоставлен какой-то библиотекой?

person Shashi    schedule 14.08.2012