2013-07-15 2 views
1

Скажем, я пытаюсь отправить аутентифицированную транзакционную очередь,Message Queue (MSMQ) не выбрасывает исключение, если сообщение не получен на другом конце

по телефону msg.send (объект, MessageQueueTransactionType.Single), сообщение не получает в транзакционной очереди, исключение не выбрано.

Что я хочу достичь после отправки , если сообщение не удается отправить, выполнить некоторую функцию и прервать транзакцию, но она не генерирует исключение, поэтому я не могу ее обработать.

Я отправляю объект из веб-приложения в локальной локальной очереди сообщений.

Мой код выглядит следующим образом в моем веб-приложение:

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

«Я отправляю объект из веб-приложения в локальной локальной очереди сообщений». Означает ли это, что отправляющее приложение и принимающая очередь находятся на одной машине? –

+0

Да, они находятся на одной машине, поэтому я должен реализовать MSMQ или сгенерировать свой самогенерируемый класс очереди? – user1663380

+0

MSMQ в порядке. Просто основной процесс очень отличается. Например, нет исходящих очередей. A Send() отправит сообщение в очередь назначения напрямую, а не в промежуточную исходящую очередь для последующей доставки. Если вы не можете отправить сообщение, вы получите исключение немедленно. Ваша попытка/улов должна быть вокруг send(). –

ответ

2

Это не собирается бросать исключение для отказа поставить, только за непредоставление место в очереди. Одна из точек очереди сообщений заключается в том, что сообщения долговечны, поэтому вы можете принять соответствующие меры, если доставка не удалась. Это означает, что вам нужно запрограммировать другой процесс для чтения очереди с мертвой буквой. Изображение ниже взято из MSDN.

Image

Поскольку весь процесс является асинхронным, ваш поток кода не будет исключением управляемого пути вашего блок кода хотел. Ваша транзакция - это просто «отправка транзакции» в этом рабочем процессе.

Рекомендация: Проверьте свою очередь сообщений, чтобы найти сообщения, либо в исходящей очереди, либо в очереди транзакционных мертвых букв.

+0

, так как я должен реализовать это в своем коде? Я действительно не могу проверить, что очередь с мертвой буквой принадлежит тому, какое приложение предполагает, что более одного приложения одновременно отправляет в одну очередь сообщений. – user1663380

+0

, скажем, после отправки. Я добавляю еще одно заявление: msgQ1.PeekById (msg.Id); – user1663380

+0

Извините, чтобы уточнить, моя «Рекомендация» касалась устранения неполадок, в отличие от решения для кодирования. Для этого вы, вероятно, захотите создать отдельную службу Windows, которая периодически заглядывает в очередь и отправляет предупреждающее сообщение, если оно слишком сильно подкреплено. – devlord

Смежные вопросы