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





Я полагаю, что вы хотите "взглянуть" на сообщение. Используйте: MessageQueue.Peek, и если вам это удалось, используйте сообщение.
Вы действительно намерены отправить это сообщение отправителю? Отправлять его самому себе очень опасно, вы будете просто бомбить снова, снова и снова.
Нет, это не совсем мое намерение. Я намерен отправить его в другую очередь, если он не удастся. Я просто тестировал концепцию в той же очереди.
Мне удалось заставить приведенный выше код работать, создав новую очередь и указав код на новую очередь.
Затем я сравнил две очереди и заметил, что новая очередь была многоадресной (первая очередь не была), и у новой очереди была метка, а у первой - нет. В остальном очереди оказались такими же.
Пара моментов: лучший способ сделать это - использовать транзакцию, охватывающую обе очереди; таким образом вы будете знать, что не потеряете сообщение.
Вторая часть - внимательно следить за тем, как создаются очереди и как вы отправляете сообщения во вторую очередь. В частности, при отправке сообщения MSMQ иногда кажется, что он «молча терпит неудачу» (хотя на самом деле сообщение об ошибке записывается в другом месте в очередях недоставленных сообщений), особенно если транзакционные параметры отправки не соответствуют транзакционному характеру цели. очередь.
Это хороший подход, но моя проблема проистекает из того факта, что я уже "выскочил" сообщение и не буду использовать функцию peek, поэтому мне придется поместить его в очередь повторных попыток.