1

C# で記述された SSIS スクリプト タスクを使用して、IBM WebSphere MQ キューに書き込みを行っています。現時点では、いくつかの単純なループを使用して、必要な情報を Dictionary オブジェクトに収集し、アイテムを 1 つずつキューに配置します。ただし、現在は 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 に非常に慣れていないため、その方法がわかりません。どうも!

EDIT 以下の回答のコードを使用すると、例外がスローされます。プログラムが MQMessage オブジェクトの「put」メソッドに到達すると、MQ 例外「MQRC_FUNCTION_NOT_SUPPORTED」がスローされます。これは _COMPlusExceptionCode = -532459699 です。

4

1 に答える 1

1

あなたへの私の提案:

  1. Messaging について少し読んでから、WebSphere MQ について読んでください。
  2. <mq_installation>\tools\dotnet\samples\cs\baseWebSphere MQ C# のサンプル (フォルダーの下にあります) を見てください。
  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 に答える