Tengo esto en una clase llamada "MessageQueueReceive".Recibir MSMQ con transacción - reversión no hacer que el mensaje vuelva a estar disponible
public MessageQueueTransaction BlockingReceive(out Message message)
{
MessageQueueTransaction tran = null;
message = null;
tran = new MessageQueueTransaction();
tran.Begin();
try
{
message = Queue.Receive(new TimeSpan(0, 0, 5), tran);
}
catch (MessageQueueException ex)
{
// If the exception was a timeout, then just continue
// otherwise re-raise it.
if (ex.MessageQueueErrorCode != MessageQueueErrorCode.IOTimeout)
throw ex;
}
return tran;
}
Entonces mi bucle de procesamiento tiene esta: - herramienta de panel
while (!Abort)
{
try
{
tran = this.Queue.BlockingReceive(out msg);
if (msg != null)
{
// Process message here
if (tran != null)
tran.Commit();
}
}
catch (Exception ex)
{
if (tran != null)
tran.Abort();
}
}
El control muestra que las colas de mensajes que estoy usando son transaccionales. La cola del diario no está habilitada.
Este código crea la cola: -
private static MessageQueue CreateMessageQueue(string queueName, bool transactional = false)
{
MessageQueue messageQueue = MessageQueue.Create(queueName, transactional);
messageQueue.SetPermissions("Administrators", MessageQueueAccessRights.FullControl,
AccessControlEntryType.Allow);
return messageQueue;
}
El parámetro transaccional se establece como "verdadero" en que se requiera.
Lo que encuentro es que cuando ocurre una excepción durante el procesamiento del mensaje, se llama a tran.Abort, pero en ese punto esperaría que el mensaje se devuelva a la cola. Sin embargo, esto no está sucediendo y los mensajes se pierden.
¿Me falta algo obvio? ¿Alguien puede ver lo que estoy haciendo mal?
¿La cola que está recibiendo en local para el servicio de escucha? –
Sí, los procesos de envío y recepción y las colas están todos en la misma casilla. Son colas privadas. También tengo el mismo código ejecutándose en algunos cuadros diferentes, y veo el mismo problema en todos.Eso sugiere que está relacionado con este código en lugar de algo peculiar sobre la máquina. – JohnCC
Pregunta obvia, supongo. ¿Estás seguro de que está llegando a la excepción con el aborto? ¿Es posible que se haya lanzado una excepción en el código de manejo de mensajes que se ha capturado y luego se ha descartado para que nunca se propague a usted el manejador de excepciones con el aborto en él? –