[英]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.