2013-02-12 3 views
3

Я использую очереди служебной шины для связи между ролью в Интернете и ролью работника. У меня две очереди в моей служебной шине. Я помещаю сообщение в очередь из веб-роли, а рабочая роль обрабатывает это сообщение и помещает другое сообщение обратно в другую очередь, которую веб-роль получает и отправляет клиенту. И потоки роли веб-роли и рабочей роли постоянно выполняются.Как работает служебная шина QueueClient.Receive?

Я хочу знать, когда контроль выполнения находится в QueueClient.Receive, ожидает ли он сообщения или нет сообщения в очереди, тогда он перемещается в следующая строка? потому что в ситуации, когда в очереди нет сообщения, я поставил точку останова в QueueClient.Receive, чтобы проверить, что произойдет дальше, но элемент управления не переходит к следующей строке, он просто исчезает, поэтому я думал, что он может просто ждать.

Но в моей роли в сети ниже я отправляю сообщение роли сотрудника через очередь служебной шины и ожидаю ответа от рабочей роли сразу, но иногда рабочая роль занимает немного времени обработки, а веб-роль не получается он и поток роли в сети переходят в спящий режим.

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

Моя рабочая Роль:

// Receive the message from Web Role 
BrokeredMessage receivedBroadcastMessage = null; 
receivedBroadcastMessage = WebRoleClient.Receive(); 

if (receivedBroadcastMessage != null) 
{ 
    // Process the message 

    receivedBroadcastMessage.Complete(); 
} 

BrokeredMessage webRoleMessage = new BrokeredMessage(processedMessage); 
WorkerRoleClient.Send(webRoleMessage); 

My Web Роль:

// send the request to worker role 
BrokeredMessage webRoleMessage = new BrokeredMessage(details); 
WebRoleClient.Send(webRoleMessage); 

// receive the queue from worker role 
BrokeredMessage workerRoleMessage = null; 
workerRoleMessage = WorkerRoleClient.Receive(); 

if (workerRoleMessage != null) 
{ 
    //process message 

    workerRoleMessage.Complete(); 
} 
else 
{ 
    // sleep thread 
} 

ответ

3

При использовании метода по умолчанию, вызов QueueClient.Receive будет немедленно вернуться. Вы получите либо значение NULL, если в указанное время не было сообщения в очереди, или экземпляр BrokeredMessage, если было сообщение.

QueueClient.Receive имеет пару переопределений, где вы можете указать тайм-аут. В этом случае метод будет ждать окончания истечения времени ожидания для возврата из вызова, если сообщений нет. Это полезно, чтобы избежать повторного подключения несколько раз, пока вы не получите сообщение.

В данном случае вы должны попробовать использовать версию API QueueClient.Receive(timespan), поэтому поток будет ждать более длительного времени для получения сообщения. Другим вариантом было бы поставить ваше сообщение, получая логику в цикле, и прорваться до тех пор, пока вы не получите сообщение.

+4

На самом деле очередь QueueClient.Receive() по умолчанию ожидает сообщения в течение нескольких секунд. Я имею в виду, что уже установлен тайм-аут по умолчанию. В любом случае я нашел способ сделать весь процесс получения сообщений асинхронно. См. Этот вопрос http://stackoverflow.com/questions/14852670/asynchronous-method-for-queueclient-receive/14853195#comment20821941_14853195 – Bitsian