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 BeginRecieve和ReceiveCompleted事件处理程序接收它.
如果我的事件处理程序在调用之前失败EndRecieve,那么该消息是否应保留在队列中并且可用于后续的接收调用?我看到的行为是消息永远消失了.(或者可能会有超时,之后它会再次出现?)
更新接收消息的代码如下所示.
var messageQueue = new MessageQueue( myPath );
messageQueue.ReceiveCompleted += messageQueue_ReceiveCompleted_ThrowException;
messageQueue.BeginReceive();
Run Code Online (Sandbox Code Playgroud)
出于测试目的,我在messageQueue_ReceiveCompleted_ThrowException事件处理程序中抛出异常.
然后我用一个工作事件处理程序重复上面的代码,但我没有被调用.
看起来问题是您正在使用BeginReceive事务性队列.来自MSDN:
注意不要对事务使用异步调用BeginReceive.如果要执行事务异步操作,请调用BeginPeek,并将事务和(同步)Receive方法放在为peek操作创建的事件处理程序中.您的事件处理程序可能包含以下C#代码中所示的功能.
对于这样的失败,我认为消息通常会进入死信队列或产生否定确认,具体取决于您配置的方式MessageQueue(这可以解释为什么您没有看到它们).您可以在此处详细了解这些选项.