2008-11-10 3 views
3

Я пытаюсь вернуть сообщение в MSMQ при вызове исключения. Появляется следующий код, но сообщение не возвращается в очередь?Повторно отправить сообщение 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); 
    } 
} 

ответ

5

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

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

0

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

+0

Это хороший подход, но моя проблема связана с тем фактом, что я уже «выскочил» из сообщения и не буду использовать peek, поэтому нужно нажать его в очередь повторов. – Guy 2008-11-10 23:02:13

2

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

+0

Нет, это не мое намерение. Мое намерение - отправить его в другую очередь, если она не удалась. Я просто тестировал концепцию в одной очереди. – Guy 2008-11-10 22:47:32

-1

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

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

Смежные вопросы