当另一端没有收到消息时,Message Queue(MSMQ)不会抛出异常

时间:2013-07-15 02:43:21

标签: msmq

假设我尝试发送到经过身份验证的事务性队列,

通过调用msg.send(object,MessageQueueTransactionType.Single),消息在事务队列中没有收到,没有抛出异常

我想要完成的是发送后,如果消息无法发送,执行某些功能并中止事务,但它不会抛出异常,所以我无法处理它。

我将Web应用程序中的对象从本地发送到本地消息队列。

我的代码在我的网络应用程序中如下:

MessageQueueTransaction mqTran=new MessageQueueTransaction();

try
{
  using(System.Messaging.Message msg=new System.Messaging.Message(){
  mqTran.Begin();

  MessageQueue adminQ = new MessageQueue(AdminQueuePath);
  MessageQueue msgQ = new MessageQueue(queuePath);
  msgQ.DefaultPropertiesToSend.Recoverable = true;

  msg.body = object;
  msg.Recoverable=true;
  msg.Label="Object";
  msg.TimeToReachQueue=new TimeSpan(0,0,30);
  msg.AcknowledgeType=AcknowledgeTypes.FullReachQueue;
  msg.ResponseQueue=adminQ;
  msg.AdministrationQueue=adminQ;
  msgQ1.Send(msg,MessageQueueTransactionType.Single);
  mqTran.Commit();
}
catch(Exception e)
{
  mqTran.Abort();
  //Do some processing if fail to send
}

1 个答案:

答案 0 :(得分:2)

它不会因未能交付而抛出异常,只是因为未能放入队列。消息排队的一个要点是消息是持久的,因此如果传递失败,您可以采取适当的措施。这意味着您需要编写另一个进程来读取死信队列。下图来自MSDN

Image

因为整个过程是异步的,所以代码流不会像代码块那样异常驱动。您的交易只是此工作流程中的“发送交易”。

建议:检查您的消息队列,以便在传出队列或事务死信队列中查找消息。