我有一個Azure訊息總線主題。 我有一個 "會話啟用 "的Azure訊息總線消費者,用于該主題。 我有大約3個作業器服務,它們使用同一個消費者。因此,作業在這3個作業者之間共享。 發送給消費者的訊息需要進行排序,這就是我在消費者上使用 "會話功能 "的原因。
我相信,在第一個訊息中,訊息的會話會被系結到一個作業器服務上。 出于某些原因,我不僅想放棄一個訊息,而且還想放棄會話,以便它可以被3個作業服務中的另一個接走。
我的問題:
- 這可能嗎?
- 如果可以的話,我如何在代碼中做到這一點?
- 是否有類似于 "是否接受會話 "的處理程式,在收到訊息時啟動?
請看下面的代碼:
private void SetupServiceBusSessionProcessors2()
{
var busProcessorOptions = new ServiceBusSessionProcessorOptions()。
var busProcessor = _busClient.CreateSessionProcessor("fooTopic", "fooSubscription", busProcessorOptions)。
busProcessor.ProcessMessageAsync = args => ProcessSessionMessageHandler2(args)。
}
Private async Task ProcessSessionMessageHandler2(ProcessSessionMessageEventArgs)
{
如果 (false) // 這里有放棄訊息和會話的條件
{
// 下面這行代碼似乎只是放棄了訊息
// 但似乎會話被鎖定在這個服務上了
// 我希望通過同一個消費者監聽的其他服務可以嘗試處理這個會話
await args.AbandonMessageAsync(args.Message)。
}
}
uj5u.com熱心網友回復:
在7.3.0-beta.1版本中,使用事件args上的ReleaseSession方法可以做到這一點。請注意,這是一個測驗版本,因此在穩定版本之前,API可能會發生變化。
uj5u.com熱心網友回復:
- 這可能嗎?
不,不可能放棄會話。
當多個并發的接收器開始從佇列中接收訊息時,屬于特定會話的訊息將被分派給當前對該會話持有鎖的特定接收器。
通過該操作,駐留在佇列或訂閱中的巨大訊息流被解復用到不同的接收者,這些接收者可以在不同的機器上,因為鎖管理發生在服務側,即服務總線內部。
放棄一條訊息會導致同一訊息在下一次接收操作中被再次提供。
發送訊息的客戶端應用程式必須在正在發送的每條訊息中設定一個唯一的識別符號作為 "SessionId"。 現在,接收應用程式應使用各自的 "SessionId "創建會話接收器,并接收與特定客戶端相關的一組訊息。
通過這種方式,所有與特定客戶端相對應的訊息都可以被一個特定的單一接收者接收。
您可以參考此檔案以了解更多資訊。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/319171.html
標籤:
下一篇:帶檔案路徑的boto3下載
