Pregunta

Estoy tratando de volver a poner un mensaje en un MSMQ cuando se produce una excepción. ¿Parece que el siguiente código funciona pero el mensaje no se vuelve a poner en la cola?

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);
    }
}
¿Fue útil?

Solución

Par de puntos: la mejor manera de hacerlo sería utilizar una transacción que abarque ambas colas; de esa manera sabrás que no perderás un mensaje.

La segunda parte es tener cuidado sobre cómo se crean las colas y cómo enviar mensajes a la segunda cola. En particular, MSMQ a veces parece fallar en silencio. al enviar un mensaje (aunque en realidad se registra un mensaje de error en otra parte de las colas de mensajes no entregados), particularmente si las opciones transaccionales del envío no coinciden con la naturaleza transaccional de la cola objetivo.

Otros consejos

¿Es realmente su intención enviar ese mensaje de regreso al autor? Enviarlo de vuelta a ti mismo es muy peligroso, simplemente bombardearás una y otra vez.

Creo que estás buscando "Peek" En el mensaje. Use: MessageQueue.Peek y, si tiene éxito, consuma el mensaje.

Conseguí que el código anterior funcionara creando una nueva cola y apuntando el código a la nueva cola.

Luego comparé las 2 colas y noté que la nueva cola era multidifusión (la primera cola no) y que la nueva cola tenía una etiqueta con la primera no. De lo contrario, las colas parecían ser las mismas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top