Pregunta

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 en caso de fracaso y me comprometo con el éxito.

Cuando se trabaja contra una cola local, este código funciona bien. Pero en producción querré separar la máquina (o máquinas) que ejecutan el servicio de la cola misma. Cuando pruebo en una cola remota, se emite una excepción System.Messaging.MessageQueueException: " El uso de la transacción no es válido. & Quot;

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;

Respuesta

Desde entonces he cambiado a SQL Service Broker . Admite recepción transaccional remota, mientras que MSMQ 3.0 no. Y, como una ventaja adicional, ya usa la instancia de SQL Server que agrupamos y respaldamos.

¿Fue útil?

Solución

Dejé un comentario preguntando sobre la versión de MSMQ que está utilizando, ya que creo que esta es la causa de su problema. Transactional Receive no se implementó en las versiones anteriores de MSMQ. Si ese es el caso, entonces este publicación de blog explica sus opciones.

Otros consejos

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();
}

Desde entonces he cambiado a SQL Service Broker . Admite recepción transaccional remota, mientras que MSMQ 3.0 no. Y, como una ventaja adicional, ya utiliza la instancia de SQL Server que agrupamos y respaldamos.

Para utilizar 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 ayudarte: Cómo activar MSDTC y remoto conexión de cliente

Aviod usando Remote MSMQ (Otra actualización a MSMQ 4.0 para soportar transacciones MSMQ remotas). 1) Alternativamente, puede crear un servicio web para impulsar los Mensajes 2) Crear MSMQ local para el propósito de la transacción 3) Cree una pequeña utilidad que tenga un número de lote (lote) y números de mensaje ... Una vez que el lote falla, elimine los mensajes en el destino, de lo contrario, haga que esto sea el alcance de la transacción

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