2013-02-12 57 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