1

我正在使用下面的代码将所有消息从队列中获取到数组中,并发送到数组中的其他队列,发生的事情是将每条消息两次发送到每个队列,我不明白为什么,任何人都可以看到任何东西明显的?

谢谢

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() 中,我最初启动了一个进程只是为了确保它有效。然后我添加了一行来用这个进程启动一个新线程,忘记把原来的线程拿出来,所以它运行了两次。哦!

于 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 回答