Domanda

Sto scrivendo un servizio Windows che estrae i messaggi da un MSMQ e li inserisce in un sistema legacy (Baan). Se il post fallisce o la macchina si arresta durante il post, non voglio perdere il messaggio. Sto quindi utilizzando le transazioni MSMQ. Mi interrompo in caso di fallimento e mi impegno per il successo.

Quando si lavora su una coda locale, questo codice funziona bene. Ma in produzione vorrò separare la macchina (o le macchine) che esegue il servizio dalla coda stessa. Quando eseguo il test su una coda remota, viene generata un'eccezione System.Messaging.MessageQueueException: " L'utilizzo della transazione non è valido. & Quot;

Ho verificato che la coda in questione è transazionale.

Ecco il codice che riceve dalla coda:

// Begin a transaction.
_currentTransaction = new MessageQueueTransaction();
_currentTransaction.Begin();

Message message = queue.Receive(wait ? _queueTimeout : TimeSpan.Zero, _currentTransaction);
_logger.Info("Received a message on queue {0}: {1}.", queue.Path, message.Label);
WORK_ITEM item = (WORK_ITEM)message.Body;
return item;

risposta

Da allora sono passato a SQL Service Broker . Supporta la ricezione transazionale remota, mentre MSMQ 3.0 no. Inoltre, come bonus aggiuntivo, utilizza già l'istanza di SQL Server di cui eseguiamo il clustering e il backup.

È stato utile?

Soluzione

Ho lasciato un commento per chiedere la versione di MSMQ che stai utilizzando, poiché penso che questa sia la causa del tuo problema. La ricezione transazionale non era implementata nelle versioni precedenti di MSMQ. In tal caso, questo post di blog spiega le tue opzioni.

Altri suggerimenti

L'uso di TransactionScope dovrebbe funzionare a condizione che MSDTC sia in esecuzione su entrambe le macchine.

MessageQueue queue = new MessageQueue("myqueue");
using (TransactionScope tx = new TransactionScope()) {
    Message message = queue.Receive(MessageQueueTransactionType.Automatic);
    tx.Complete();
}

Da allora sono passato a SQL Service Broker . Supporta la ricezione transazionale remota, mentre MSMQ 3.0 no. Inoltre, come bonus aggiuntivo, utilizza già l'istanza di SQL Server di cui eseguiamo il clustering e il backup.

Per utilizzare l'ambito Transaction è necessario prima verificare che MSDTC sia installato e che sia stata attivata la connessione client remota.

L'installazione di MSDTC non è un problema ma l'attivazione della connessione client remota deve causare il riavvio del server (su Windows Server 2003 questo è il caso).

forse questo post può aiutarti: Come attivare MSDTC e remoto connessione client

Aviod utilizzando Remote MSMQ (altrimenti aggiornamento a MSMQ 4.0 per supportare la transazione MSMQ remota). 1) In alternativa puoi creare un servizio web per inviare i messaggi 2) Creare MSMQ locale a scopo di transazione 3) Crea una piccola utility che ha un numero di bundle (batch) e numeri di messaggistica ... Una volta che il batch è fallito, elimina i messaggi sul target altrimenti rendilo come ambito di transazione

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