2016-04-07 91 views
0

我有幾個客戶端應用程序正在等待將消息作業從Azure服務總線隊列中取出。單個Azure服務總線隊列的多個客戶端

一旦客戶端有了這份工作,我不希望任何其他客戶端應用程序接收到這份工作。

如果所有客戶端都實現Queue.OnMessage()以通知到達消息,我如何確定2個或更多客戶端不接收消息?

+0

你能說清楚嗎?你是否要求1個消費者應該只能得到一種類型的消息,但其他消費者不應該或者當一個消費者得到其他消費者不應該的消息時?如果你說清楚並舉一個例子,那會更好。 –

回答

1

我的理解是,只要其中一個工作人員從隊列中獲得一件物品,就會在某個可配置的時間(租賃)內爲其他人隱藏。如果工人成功完成作業,則通知隊列該項目可以被刪除。如果工人失敗,它可以通知隊列將物品移動到死信隊列中,如果工人在其他工人的租約時間後變爲可見物品。項目內應該有一個屬性(由ServiceBus設置),表示物品交付的次數。還有一個TTL(生存時間),之後物品將自動移動到死信隊列中。

0

爲了避免這種使用隊列,您可以使用Azure Service Bus的會話功能。

在做其他任何事情之前,您需要首先創建一個會話感知隊列,這可以按如下方式完成。

// Create a queue with duplicate detection 
// with a detection history window of one hour, 
// and requires sessions. 

QueueDescription rfidCheckoutQueueDescription = new QueueDescription("rfidcheckout") 
{ 

    RequiresSession = true, 

    RequiresDuplicateDetection = true, 

    DuplicateDetectionHistoryTimeWindow = new TimeSpan(0, 1, 0) 

}; 

// Create a queue that supports duplicate detection. 
namespaceMgr.CreateQueue(rfidCheckoutQueueDescription); 

當會話知道隊列設置必須設置SessionId屬性的消息,並收到使用MessageSession代替QueueClient消息。

爲此可以找到一些代碼示例: Sending Messages,Receiving Messages

+0

如果您想將特定消息路由到特定的消費者,會話很有用。如果你想簡單地分配負載,並確保一個項目只處理一次你不應該需要會話 – Helikaon

+0

啊是的,道歉我誤解了這個問題。 –

相關問題