.net - ¿Cómo uso un MSMQ remoto de forma transaccional?
transactions (5)
Aviod usando Remote MSMQ (otra actualización a MSMQ 4.0 para admitir transacciones remotas de MSMQ). 1) Alternativamente, puede crear un servicio web para enviar los mensajes 2) Crear un MSMQ local para fines de transacción 3) Crear una pequeña utilidad que tenga un lote (lote) número y número de mensajes ... Una vez que el lote falla, elimine los mensajes en el destino; como alcance de la transacción
Estoy escribiendo un servicio de Windows que extrae mensajes de un MSMQ y los publica en un sistema heredado (Baan). Si la publicación falla o la máquina se cae durante la publicación, no quiero perder el mensaje. Por lo tanto, estoy usando transacciones MSMQ. Aborto al fallar y me comprometo con el éxito.
Al trabajar contra una cola local, este código funciona bien. Pero en producción querré separar la máquina (o máquinas) que ejecuta el servicio de la cola misma. Cuando pruebo contra una cola remota, se lanza una excepción System.Messaging.MessageQueueException: "El uso de la transacción no es válido".
He verificado que la cola en cuestión es transaccional.
Aquí está el código que recibe de la cola:
// 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;
Responder
Desde entonces he cambiado a SQL Service Broker . Es compatible con la recepción transaccional remota, mientras que MSMQ 3.0 no. Y, como beneficio adicional, ya usa la instancia de SQL Server que agrupamos y realizamos una copia de seguridad.
Dejé un comentario preguntándome sobre la versión de MSMQ que estás usando, ya que creo que esta es la causa de tu problema. La recepción transaccional no se implementó en las versiones anteriores de MSMQ. Si ese es el caso, esta publicación del blog explica sus opciones.
Desde entonces he cambiado a SQL Service Broker . Es compatible con la recepción transaccional remota, mientras que MSMQ 3.0 no. Y, como beneficio adicional, ya usa la instancia de SQL Server que agrupamos y realizamos una copia de seguridad.
El uso de TransactionScope debería funcionar siempre que el MSDTC se ejecute en ambas máquinas.
MessageQueue queue = new MessageQueue("myqueue");
using (TransactionScope tx = new TransactionScope()) {
Message message = queue.Receive(MessageQueueTransactionType.Automatic);
tx.Complete();
}
Para usar el alcance de la transacción, debe verificar antes que MSDTC esté instalado y que se haya activado la conexión remota del cliente.
Instalar MSDTC no es un problema, pero activar la conexión remota del cliente debe provocar el reinicio del servidor (en Windows Server 2003 este es el caso).
tal vez esta publicación pueda ayudarlo: Cómo activar MSDTC y la conexión remota del cliente