1

我正在使用用 C# 编写的 SSIS 脚本任务写入 IBM WebSphere MQ 队列。目前,我们使用几个简单的循环将我们需要的信息收集到一个 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 很陌生,不知道如何使用。谢谢!

编辑使用下面答案中的代码会导致抛出异常。一旦程序到达 MQMessage 对象的“put”方法,就会抛出 MQ 异常“MQRC_FUNCTION_NOT_SUPPORTED”。这是 _COMPlusExceptionCode = -532459699

4

1 回答 1

1

我给你的建议:

  1. 阅读一些关于 Messaging 和 WebSphere MQ 的信息。
  2. 查看 WebSphere MQ C# 示例(位于<mq_installation>\tools\dotnet\samples\cs\base文件夹下)。
  3. 写一些样本让自己舒服。

要使其具有原子性,您可以使用 WebSphere MQ 的 XA 事务特性。您基本上需要将您的工作包装在 Transaction 范围内。示例伪代码段。

// 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方法?这是您自己的方法还是由某个库提供的?

于 2012-08-14T04:11:09.120 回答