第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何確保在關(guān)閉 MessageReciever 期間完成 MessageHandler 委托?

如何確保在關(guān)閉 MessageReciever 期間完成 MessageHandler 委托?

C#
繁星點(diǎn)點(diǎn)滴滴 2021-08-22 17:29:03
我有一個(gè)服務(wù),它使用MessageReceiverfromMicrosoft.Azure.ServiceBus連續(xù)收聽 ServiceBus 中的訂閱。當(dāng)服務(wù)停止時(shí),我想在進(jìn)程被終止之前給所有操作完成的機(jī)會(huì)。這是我根據(jù)庫(kù)提供的示例使用的代碼:private async Task StartReceiveLoop(IMessageReceiver receiver, CancellationToken cancellationToken){    var doneReceiving = new TaskCompletionSource<bool>();    cancellationToken.Register(() =>    {        receiver.CloseAsync();        doneReceiving.SetResult(true);    });    receiver.RegisterMessageHandler(        async (message, ct) => await HandleMessage(receiver, message),        new MessageHandlerOptions(HandleException));    await doneReceiving.Task;}在服務(wù)停止時(shí),我取消了任務(wù),即使服務(wù)HandleMessage仍在運(yùn)行,它也會(huì)立即被終止。有什么方法可以通過庫(kù)本身檢查操作是否仍在運(yùn)行以延遲任務(wù)取消?我可以想到一種通過鎖定所有正在運(yùn)行的任務(wù)來進(jìn)行自己計(jì)數(shù)的方法,但我希望有一種更好的方法可以讓我知道正在運(yùn)行的處理程序的數(shù)量。理想情況下,我想取消注冊(cè)處理程序,以便消息泵停止,而接收器本身不會(huì)關(guān)閉以允許例如 CompleteAsync 調(diào)用。
查看完整描述

2 回答

?
一只萌萌小番薯

TA貢獻(xiàn)1795條經(jīng)驗(yàn) 獲得超7個(gè)贊

由于MessageReceiver.CloseAsync()提到如下:

關(guān)閉客戶端。關(guān)閉由它打開的連接。

按我的測(cè)試,稱為后MessageReceiver.CloseAsync(),后續(xù)調(diào)用CompleteAsync,DeadLetterAsync將自實(shí)例失敗IMessageReceiver已被釋放。如果你仍然想完成你的隊(duì)列消息,你需要?jiǎng)?chuàng)建一個(gè)新的MessageReceiver.

有什么方法可以通過庫(kù)本身檢查操作是否仍在運(yùn)行以延遲任務(wù)取消?

AFAIK,SDK 目前不提供上述功能。此外,這里還有一個(gè)類似的關(guān)于正常關(guān)閉 Azure 服務(wù)總線的消息泵的反饋。

當(dāng)服務(wù)停止時(shí),我想在進(jìn)程被終止之前給所有操作完成的機(jī)會(huì)。

對(duì)于您的要求,我假設(shè)您需要自己實(shí)現(xiàn)它以確保即使在 MessageReceiver 關(guān)閉后也可以成功處理接收到的隊(duì)列消息?;蛘吣梢詫?code>CancellationToken參數(shù)傳遞到您的HandleMessage方法中以顯式取消而不是完成檢索到的消息。


查看完整回答
反對(duì) 回復(fù) 2021-08-22
?
開滿天機(jī)

TA貢獻(xiàn)1786條經(jīng)驗(yàn) 獲得超13個(gè)贊

另一個(gè)答案表明,不幸的是,現(xiàn)在無法實(shí)現(xiàn)該功能,即使該功能在庫(kù)本身中不可用,也很受歡迎。一種替代方法是創(chuàng)建您自己的接收消息泵,但隨后您就可以自己進(jìn)行斷開連接、管理等操作,盡管正常關(guān)閉本身并不難。使用當(dāng)前的方法,我設(shè)法編寫了一種解決方法,即使它很笨拙,它似乎也能正常工作。


private async Task StartReceiveLoop(IMessageReceiver receiver, CancellationToken cancellationToken)

{

    int activeMessageHandlersCount = 0;

    var doneReceiving = new TaskCompletionSource<bool>();


    cancellationToken.Register(() =>

    {

        lock (receiver)

        {

            int attemptCount = 0;

            while (attemptCount++ < 10 && activeMessageHandlersCount > 0)

            {

                Thread.Sleep(1000);

            }


            receiver.CloseAsync();

        }


        doneReceiving.SetResult(true);

    });


    receiver.RegisterMessageHandler(

        async (message, ct) =>

        {

            bool canBeProcessed;

            lock (receiver)

            {

                canBeProcessed = !cancellationToken.IsCancellationRequested;

                if (canBeProcessed)

                {

                    Interlocked.Increment(ref activeMessageHandlersCount);

                }

            }


            if (canBeProcessed)

            {

                try

                {

                    await HandleMessage(receiver, message);

                }

                finally

                {

                    Interlocked.Decrement(ref activeMessageHandlersCount);

                }

            }

            else

            {

                await Task.Delay(60000); // Otherwise message receiver will keep pumping message during graceful shutdown

            }

        }, new MessageHandlerOptions(HandleException));


    await doneReceiving.Task;

}

另一個(gè)缺點(diǎn)是 Receiver 將接收大量消息而不進(jìn)行處理,并將它們保留到鎖定到期。


查看完整回答
反對(duì) 回復(fù) 2021-08-22
  • 2 回答
  • 0 關(guān)注
  • 211 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)