我有一个名为“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();
}
}
控制面板工具显示我使用的消息队列是事务型的,但未启用日志队列。
此代码创建了该队列:-
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”。
我发现,在处理消息过程中发生异常时,会调用tran.Abort,但在那时我希望消息被返回到队列中。然而,这并没有发生,消息丢失了。
我是否漏掉了一些明显的东西?有人能看出我做错了什么吗?