2013-02-12 45 views
3

我正在使用服务总线队列在Web角色和工作者角色之间进行通信。我的服务巴士上有两个队列。我将一条消息从web角色放入队列,并且worker角色处理该消息,并将另一条消息放回到另一个队列中,该角色将由Web角色检索并发送到客户端。 Web角色和工作者角色线程都在不断运行服务总线QueueClient.Receive如何工作?

我想知道何时执行控件位于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); 

我的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 2013-02-19 05:03:42