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

3
我正在使用服务总线队列在Web角色和工作角色之间进行通信。我的服务总线中有两个队列。我从Web角色将消息放入队列,然后工作角色处理该消息并将另一条消息放回另一个队列,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有一些重载,您可以在其中指定超时时间。在这种情况下,如果没有任何消息,该方法将等待直到超时时间过期才从调用中返回。这很有用,可以避免多次重新连接直到收到消息。

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


5
默认的QueueClient.Receive()方法会等待几秒钟来接收消息,也就是说已经设置了默认的超时时间。不过我找到了一种异步接收消息的方法。请参考这个问题的链接:https://dev59.com/-W7Xa4cB1Zd3GeqPpWnN#XogHoYgBc1ULPQZFLC_7 - Bitsian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接