首页 文章

服务总线QueueClient.Receive如何工作?

提问于
浏览
3

我正在使用服务总线队列在Web角色和工作者角色之间进行通信 . 我的服务总线上有两个队列 . 我将一条消息从Web角色放入队列,而worker角色处理该消息,并将另一条消息放回另一个队列,Web角色将检索并发送给客户端 . Web角色和辅助角色线程都在不断运行

我想知道执行控制何时在QueueClient.Receive,它是否等到收到消息或队列中没有消息然后它移动到下一行?因为在队列中没有消息的情况下,我在QueueClient.Receive上放置了一个断点来检查接下来会发生什么,但是控件没有进入下一行它只是消失所以我认为它可能只是在等待 .

但是在我的web角色下面,我通过服务总线队列向工作者角色发送消息,并期待工作者角色立即再次响应,但有时工作者角色需要一些处理时间,并且Web角色无法获得它和Web角色线程进入睡眠状态 .

我是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);

我的网站角色:

// 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
}

1 回答

  • 3

    使用默认方法,将立即返回对QueueClient.Receive的调用 . 如果在该特定时间队列中没有消息,则将获得NULL值,如果有消息,则获取BrokeredMessage的实例 .

    QueueClient.Receive有几个覆盖,您可以在其中指定超时 . 在这种情况下,如果没有任何消息,该方法将等待超时到期以从呼叫返回 . 这有助于避免在收到消息之前多次重新连接 .

    对于您提到的情况,您应该尝试使用API的QueueClient.Receive(timespan)版本,因此线程将等待更长时间来接收消息 . 另一种选择是将消息接收逻辑放在一个循环中,然后中断直到收到消息 .

相关问题