2017-09-05 175 views
0

爲了記錄目的,我希望獲得給定訂閱客戶端的Azure服務總線訂閱的消息數。唯一的examples我發現使用NamespaceManager,但這似乎有點多餘,因爲我已經有一個SubscriptionClient。有沒有辦法直接從客戶端到SubscriptionDescription從SubscriptionClient獲取消息數

FWIW,我試圖通過名字空間管理器使用的彎路,但我得到了它拋出一個401未經授權錯誤:

int GetMessageCount(SubscriptionClient client) { 
    NameSpaceManager nsm = new NamespaceManager(client.MessagingFactory.NamespaceEndpoints.First()); 
    SubscriptionDescription desc = nsm.GetSubscription(client.TopicPath, client.Name); // <-- throws error 
    long numMsg = desc.MessageCount; 
    return numMsg; 
} 

回答

1

Is there a way to go directly from the client to the SubscriptionDescription?

SubscriptionClient Class,它並沒有提供一個直接的方式來從給定的SubscriptionClient對象獲取消息計數。

it throws a 401 Unauthorized error

代碼client.MessagingFactory.NamespaceEndpoints.First()回報命名空間端點,初始化Microsoft.ServiceBus.NamespaceManager類與服務命名空間URI基址的新實例,但你不指定授權您執行的操作的憑據,因此當您執行GetSubscription操作時,它會返回401錯誤。下面的代碼在我身邊很好,你可以試試。

NamespaceManager nsm = new NamespaceManager(client.MessagingFactory.NamespaceEndpoints.First(), TokenProvider.CreateSharedAccessSignatureTokenProvider("{keyName}", "{SharedAccessKey}")); 

var subscriptionDesc = nsm.GetSubscription(topicName, subscriptionName); 

long messageCount = subscriptionDesc.MessageCount; 
+0

我現在做類似的事情,請在我的評論中看到其他答案。 – ThS

1

您正在構建帶有錯誤數據的NamespaceManager

client.MessagingFactory.NamespaceEndpoints.First() 

返回Azure的服務總線命名空間URI,而不是需要一個連接字符串。

Is there a way to go directly from the client to the SubscriptionDescription?

不是真的。要在實體上獲取消息計數是一項管理操作,必須經過NamespaceManager。客戶端是對消息的運行時操作,而不是對實體的管理。另外,您不應該每次都創建名稱空間管理器。一旦擁有它,將其緩存並重新使用。

+0

太糟糕了。我最終創建了NamespaceManager一次,然後每次我想知道消息的數量時調用'GetSubscription()'。代碼有點混亂,因爲我必須傳遞NamespaceManager。 – ThS

+1

根據庫設計,您不應該將管理操作與消息操作混合使用。新的microsoft.azure.servicebus客戶端更加強化了這一點。 –

+0

是的,我對我的實施並不滿意,但它完成了工作。現在我明白事情會很快變得複雜。如果我要深入這條路線,我會清理它並分開兩個問題。 – ThS