假设我尝试发送到经过身份验证的事务性队列,
通过调用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
}
答案 0 :(得分:2)
它不会因未能交付而抛出异常,只是因为未能放入队列。消息排队的一个要点是消息是持久的,因此如果传递失败,您可以采取适当的措施。这意味着您需要编写另一个进程来读取死信队列。下图来自MSDN。
因为整个过程是异步的,所以代码流不会像代码块那样异常驱动。您的交易只是此工作流程中的“发送交易”。
建议:检查您的消息队列,以便在传出队列或事务死信队列中查找消息。