如果我的函数在处理时失败,System.MessageQueue(MSMQ)消息是否会丢失?

tpo*_*wer 3 c# msmq message-queue

我使用以下代码发送消息:

var transaction = new MessageQueueTransaction())
transaction.Begin(  );

var message = new Message
{
   Body = myContent,
   Recoverable = true
};

m_oMessageQueue.Send( message , myTransaction );

transaction.Commit( );
Run Code Online (Sandbox Code Playgroud)

并使用a BeginRecieveReceiveCompleted事件处理程序接收它.

如果我的事件处理程序在调用之前失败EndRecieve,那么该消息是否应保留在队列中并且可用于后续的接收调用?我看到的行为是消息永远消失了.(或者可能会有超时,之后它会再次出现?)

更新接收消息的代码如下所示.

var messageQueue = new MessageQueue( myPath );
messageQueue.ReceiveCompleted += messageQueue_ReceiveCompleted_ThrowException;
messageQueue.BeginReceive();
Run Code Online (Sandbox Code Playgroud)

出于测试目的,我在messageQueue_ReceiveCompleted_ThrowException事件处理程序中抛出异常.

然后我用一个工作事件处理程序重复上面的代码,但我没有被调用.

Jef*_*nal 9

看起来问题是您正在使用BeginReceive事务性队列.来自MSDN:

注意不要对事务使用异步调用BeginReceive.如果要执行事务异步操作,请调用BeginPeek,并将事务和(同步)Receive方法放在为peek操作创建的事件处理程序中.您的事件处理程序可能包含以下C#代码中所示的功能.

对于这样的失败,我认为消息通常会进入死信队列或产生否定确认,具体取决于您配置的方式MessageQueue(这可以解释为什么您没有看到它们).您可以在此处详细了解这些选项.