2012-08-13 128 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

相關問題