У меня есть это в классе под названием "MessageQueueReceive".
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;
}
Тогда мой цикл обработки имеет следующее: -
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();
}
}
Инструмент панели управления показывает, что очереди сообщений IИспользую транзакционные.Очередь журнала не включена.
Этот код создает очередь: -
private static MessageQueue CreateMessageQueue(string queueName, bool transactional = false)
{
MessageQueue messageQueue = MessageQueue.Create(queueName, transactional);
messageQueue.SetPermissions("Administrators", MessageQueueAccessRights.FullControl,
AccessControlEntryType.Allow);
return messageQueue;
}
Транзакционный параметр устанавливается как "true", когда он вызывается.
Что яfind заключается в том, что когда возникает исключение во время обработки сообщения, вызывается tran.Abort, но в этот момент я ожидаю, что сообщение будет возвращено в очередь.Однако этого не происходит, и сообщения теряются.
Я что-то упускаю из виду?Кто-нибудь может увидеть, что я делаю не так?