【问题标题】:Resend to MSMQ after exception异常后重新发送到 MSMQ
【发布时间】:2009-11-07 07:06:27
【问题描述】:

我试图在抛出异常时将消息放回 MSMQ。以下代码似乎可以工作,但消息没有放回队列中?

Message msg = null;
try
{
    MessageQueue MQueue = new MessageQueue(txtMsgQPath.Text);
    msg = MQueue.ReceiveById(txtQItemToRead.Text);
    lblMsgRead.Text = msg.Body.ToString(); // This line throws exception
}
catch (Exception ex)
{
    lblMsgRead.Text = ex.Message;
    if (msg != null)
    {
        MessageQueue MQ = new MessageQueue(txtMsgQPath.Text);
        MQ.Send(msg);
    }
}

【问题讨论】:

    标签: c# .net msmq


    【解决方案1】:

    几点:最好的方法是使用跨越两个队列的事务;这样你就知道你不会丢失消息。

    第二部分是要注意队列是如何创建的以及如何将消息提交到第二个队列。特别是,MSMQ 在发送消息时有时会出现“静默失败”(尽管实际上错误消息记录在死信队列的其他位置),特别是如果发送的事务选项与目标的事务性质不匹配排队。

    【讨论】:

      【解决方案2】:

      您真的打算将该消息发回给发起者吗?把它寄回给自己是非常危险的,你只会一遍又一遍地再次炸弹。

      【讨论】:

      • 不,这不是我真正的意图。如果失败,我的意图是把它发送到不同的队列。我只是在同一个队列上测试这个概念。
      【解决方案3】:

      我相信您正在寻找“偷看”消息。使用:MessageQueue.Peek,如果成功,则使用该消息。

      【讨论】:

      • 这是一个好方法,但我的问题源于我已经“弹出”消息并且不会使用 peek 因此必须将其推送到重试队列。
      【解决方案4】:

      我设法通过创建一个新队列并将代码指向新队列来使上面的代码工作。

      然后我比较了 2 个队列,发现新队列是多播的(第一个队列不是),新队列有一个标签,而第一个没有。否则,队列似乎是相同的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-02
        • 2014-07-09
        • 2012-01-13
        • 1970-01-01
        • 2010-10-26
        • 1970-01-01
        • 2023-04-01
        相关资源
        最近更新 更多