Переслать в MSMQ после исключения - PullRequest
3 голосов
/ 11 ноября 2008

Я пытаюсь поместить сообщение обратно в 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);
    }
}

Ответы [ 4 ]

5 голосов
/ 11 ноября 2008

Пара моментов: лучший способ сделать это - использовать транзакцию, охватывающую обе очереди; таким образом, вы будете знать, что не потеряете сообщение.

Вторая часть - внимательно следить за тем, как создаются очереди и как вы отправляете сообщения во вторую очередь. В частности, MSMQ иногда кажется, что «молча терпит неудачу» при отправке сообщения (хотя в действительности сообщение об ошибке записывается в другом месте в очереди недоставленных сообщений), особенно если транзакционные параметры отправки не соответствуют транзакционному характеру цели очереди.

2 голосов
/ 11 ноября 2008

Действительно ли вы намереваетесь отправить это сообщение обратно отправителю? Отправлять его обратно себе очень опасно, вы будете просто снова и снова бомбить.

0 голосов
/ 11 ноября 2008

Мне удалось заставить приведенный выше код работать, создав новую очередь и наведя код на новую очередь.

Затем я сравнил 2 очереди и заметил, что новая очередь была многоадресной (первая очередь не была), а новая очередь имела метку, а первая - нет. В противном случае очереди оказались одинаковыми.

0 голосов
/ 11 ноября 2008

Я полагаю, что вы смотрите "Peek" на сообщение. Используйте: MessageQueue.Peek и, если вам это удастся, то используйте сообщение.

...