簡體   English   中英

Azure 持久功能在本地運行時在啟動時運行多次

[英]Azure durable function running multiple times on startup when running locally

我有一個 http 觸發的 azure 持久函數,帶有一個名為“ExecuteWork”的編排觸發器和兩個活動,即“HandleClaimsForms”和“HandleApplicationForms”。 我將在下面添加它們的定義。 該函數用於處理 blob 存儲容器中的 PDF。 在本地運行時,它將在啟動時執行“HandleClaimsForms”四五次而不被調用。

以下是它正在生成的日志:

Functions:

        Function1: [GET,POST] http://localhost:7071/api/Function1

        ExecuteWork: orchestrationTrigger

        HandleApplicationForms: activityTrigger

        HandleClaimsForms: activityTrigger

[2022-06-07T12:39:44.587Z] Executing 'HandleClaimsForms' (Reason='(null)', Id=c45878fe-35c8-4a57-948e-0b43da969427)
[2022-06-07T12:39:44.587Z] Executing 'HandleClaimsForms' (Reason='(null)', Id=0fb9644d-6748-4791-96cf-a92f6c161a97)
[2022-06-07T12:39:44.587Z] Executing 'HandleClaimsForms' (Reason='(null)', Id=9a39a169-a91d-4524-b5e5-63e6226f70ec)
[2022-06-07T12:39:44.587Z] Executing 'HandleClaimsForms' (Reason='(null)', Id=b3697f6b-7c96-4497-826f-3894359ff361)
[2022-06-07T12:39:44.587Z] Executing 'HandleClaimsForms' (Reason='(null)', Id=3ca3bbce-1657-453b-a5b3-e9dbdb940302)

以下是函數定義:

函數入口點

[FunctionName("Function1")]
        public async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
            [DurableClient] IDurableOrchestrationClient starter,
            ILogger log)
        {
            string instanceID = await starter.StartNewAsync("ExecuteWork");

            return starter.CreateCheckStatusResponse(req, instanceID);
        }

編排觸發器

[FunctionName("ExecuteWork")]
        public async Task<bool> ProcessForms(
            [OrchestrationTrigger] IDurableOrchestrationContext context,
            ILogger log)
        {
            bool success = true;
            try
            {
                await context.CallActivityAsync("HandleClaimsForms", success);
                await context.CallActivityAsync("HandleApplicationForms", success);

                return success;
            }
            catch (Exception err)
            {
                log.LogInformation($"The following error was thrown: {err}");
                success = false;
                return success;
            }
        }

HandleClaimsForm 活動

        public async Task<bool> ProcessClaimsForms(
            [ActivityTrigger]bool success)
        {

                await _docHandler.Handle();

                return success;
        }

處理應用程序表單活動

[FunctionName("HandleApplicationForms")]
        public async Task<bool> ProcessApplicationForms(
            [ActivityTrigger]bool success)
        {

            await _appHandler.HandleJsonApplicationFormAsync();

            return success;
        }

您可以遵循解決上述問題的一種解決方法,

根據關於可靠性的MICROSOFT DOCUMENT是:

  • Durable Functions 透明地使用事件溯源。 在幕后,編排器函數中的 await (C#) 或 yield (JavaScript/Python) 運算符將編排器線程的控制權交還給 Durable Task Framework 調度程序

  • 每當編排函數有更多工作要做時(例如,當收到響應消息或持久計時器到期時),編排器就會喚醒並從頭開始重新執行整個函數以重建本地狀態。 如果代碼在重放期間嘗試調用函數或執行任何其他異步任務,則持久任務框架會分析編排的執行歷史記錄。 如果它發現活動函數已經運行並產生了結果,它會在協調器代碼繼續運行時重放該結果。 播放將繼續,直到功能代碼終止或安排了額外的異步工作。

另一種方法是使用依賴注入

有關更多信息,請參閱以下鏈接:-

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM