Я использую очереди служебной шины для связи между ролью в Интернете и ролью работника. У меня две очереди в моей служебной шине. Я помещаю сообщение в очередь из веб-роли, а рабочая роль обрабатывает это сообщение и помещает другое сообщение обратно в другую очередь, которую веб-роль получает и отправляет клиенту. И потоки роли веб-роли и рабочей роли постоянно выполняются.Как работает служебная шина 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
}
На самом деле очередь QueueClient.Receive() по умолчанию ожидает сообщения в течение нескольких секунд. Я имею в виду, что уже установлен тайм-аут по умолчанию. В любом случае я нашел способ сделать весь процесс получения сообщений асинхронно. См. Этот вопрос http://stackoverflow.com/questions/14852670/asynchronous-method-for-queueclient-receive/14853195#comment20821941_14853195 – Bitsian