1

以下のコードを使用して、キューからすべてのメッセージを配列に取得し、配列内の他のキューに送信します。何が起こっているのかは、すべてのメッセージをすべてのキューに 2 回送信し、理由がわかりません。誰もが何かを見ることができます明らか?

ありがとう

public void SendToQs()
{
    Code.Class1 c = new Code.Class1();
    oInQueue = new MessageQueue(sInQueue);
    Message[] msgs = oInQueue.GetAllMessages();

    var queueArray = sOutQueues.Select(s => new MessageQueue(s)).ToArray();
    foreach (Message msg in msgs)
    {
        foreach (MessageQueue s in queueArray)
        {
            c.WriteMessage(s, msg, msg.Label);
        }

    }
    oInQueue.Purge();
}

書き込みメッセージ:

public void WriteMessage(MessageQueue outputQueue, Message msg, string label)
{
    if (!outputQueue.Transactional)
    {
        try
        {
            outputQueue.Send(msg, label);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
    else
    {
        MessageQueueTransaction trans = new MessageQueueTransaction();
        try
        {
            trans.Begin();
            outputQueue.Send(msg, label, trans);
            trans.Commit();
        }
        catch (Exception ex)
        {
            Console.WriteLine("message Q exception" + ex.Message);
            trans.Abort();
        }
    }
}
4

2 に答える 2

1

わかった、そして私が期待していたようにそれはばかげていた!私の void Main() では、最初はプロセスが機能することを確認するためだけにプロセスを開始していました。次に、このプロセスで新しいスレッドを開始する行を追加しましたが、元のスレッドを削除するのを忘れたため、2 回実行されていました。ドー!

于 2013-11-08T11:32:09.120 に答える
0

これをテストする時間がありませんでしたが、これを検討することをお勧めします。

キューのすべてのメッセージが他のキューに送信されている場合、キューのリストを反復処理すると、元のキューにもこのメッセージが送信されます。

foreach (Message msg in msgs)
{
   foreach (MessageQueue s in queueArray)
   {
      if (s.Id == oInQueue.Id) continue; // Skip if this is the originator
      c.WriteMessage(s, msg, msg.Label);
   }
}
于 2013-11-06T15:16:48.040 に答える