2012-08-13 93 views
1

我正在使用用C#编写的SSIS脚本任务写入IBM WebSphere MQ队列。目前我们使用几个简单的循环来将我们需要的信息收集到Dictionary对象中,然后将这些项目逐个放入队列中。但是,我们现在正在从SQL数据库中提取数据,并且需要将这些更新设置为原子数据库。更新到WebSphere MQ队列原子

这里是用来将信息添加到字典

//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

回答

1

我给你的建议:

  1. 阅读了有关消息,然后WebSphere MQ的一点点。
  2. 查看WebSphere MQ C#示例(在<mq_installation>\tools\dotnet\samples\cs\base文件夹下找到)。
  3. 写一些样品,让自己舒服。

要使其成为原子,您可以使用WebSphere MQ的XA事务功能。您基本上需要将您的工作包装在交易范围中。示例伪代码片段。

// 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; 
    } 

BTW,我有兴趣知道MqPut方法?这是你自己的方法还是由某个图书馆提供的?

+0

这是我们自己的方法。 – NealR 2012-08-14 15:27:33

相关问题