Domanda

Sto cercando di reinserire un messaggio in un MSMQ quando viene generata un'eccezione. Il seguente codice sembra funzionare ma il messaggio non viene reinserito nella coda?

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);
    }
}
È stato utile?

Soluzione

Coppia di punti: il modo migliore per farlo sarebbe usare una transazione che si estende su entrambe le code; in questo modo saprai che non perderai un messaggio.

La seconda parte deve fare attenzione a come vengono create le code e come si inviano i messaggi alla seconda coda. In particolare, MSMQ a volte sembra non riuscire "silenziosamente". quando si invia un messaggio (anche se in realtà un messaggio di errore viene registrato altrove nelle code di lettere non recapitate), in particolare se le opzioni transazionali dell'invio non corrispondono alla natura transazionale della coda di destinazione.

Altri suggerimenti

È davvero tua intenzione rispedire quel messaggio al mittente? Restituirlo a te stesso è molto pericoloso, bombarderai ancora, ancora e ancora.

Credo che tu stia cercando di " Peek " al messaggio. Usa: MessageQueue.Peek e, se ci riesci, consuma il messaggio.

Sono riuscito a far funzionare il codice sopra creando una nuova coda e puntando il codice sulla nuova coda.

Ho quindi confrontato le 2 code e ho notato che la nuova coda era multicast (la prima coda non lo era) e la nuova coda aveva un'etichetta con la prima no. Altrimenti le code sembravano essere le stesse.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top