[英]Azure durable function running multiple times on startup when running locally
[英]Azure Durable Function Activity seems to run multiple times and not complete
我有一個 Durable Function Fan Out 和 In 模式,它似乎無法可靠地工作。 Orchestration 每 10 分鍾從 Timer 函數調用一次,但此后增加到 20。Activity 函數使用 context.CallActivityAsync 調用並返回一個整數(處理的行數)。 目前,傳入的 workItems 應該只包含 2 個要處理的項目。 第一項處理所有行並在日志中顯示完整。 第二個項目有時會顯示正在處理的行,但在某些時候它會停止......沒有其他活動被識別,“完成”永遠不會出現在日志中。 此外,第二個活動有時會顯示它同時運行多次......我已經在我的開發機器上使用相同的數據嘗試了這個確切的代碼,並且它處理完成的時間不超過 5 分鍾。 我還將 hosts.json 文件設置為
{
"version": "2.0",
"functionTimeout": "00:10:00",
"extensions": {
"queues": {
"maxPollingInterval": "00:00:05"
}
}
}
編排:
public static async void RunOrchestrator(
[OrchestrationTrigger] DurableOrchestrationContext context, ILogger log)
{
log.LogInformation($"************** Fanning out ********************");
var parallelTasks = new List<Task<int>>();
//object[] workBatch = await context.CallActivityAsync<object[]>("GETVendors", null);
object[] workBatch = GETVendors(log); //work batch only has 2 items
for (int i = 0; i<workBatch.Length; i++)
{
Task<int> task = context.CallActivityAsync<int>("SynchVendor", workBatch[i]);
parallelTasks.Add(task);
}
log.LogInformation($"************** 'Waiting' for parallel results ********************");
await Task.WhenAll(parallelTasks);
log.LogInformation($"************** All activity functions complete ********************");
log.LogInformation($"************** fanning in ********************");
int cnt = 0;
foreach (var completedParallelActivity in parallelTasks)
{
cnt += completedParallelActivity.Result;
}
log.LogInformation($"Total Records Converted across all tasks = {cnt}");
//return outputs;
}
活動功能
public static async Task<int> SynchVendor([ActivityTrigger] string vendor, ILogger log)
{
log.LogInformation($"SynchVendor {vendor}");
string sqlStr = Environment.GetEnvironmentVariable("Sqldb_Connection");
bool dev = Convert.ToBoolean(Environment.GetEnvironmentVariable("Dev"));
int totalCount = 0;
using (SqlConnection conn = new SqlConnection(sqlStr))
{
conn.Open();
// lets synch the vendor
Int32 limit = 200;
bool initialLoad = false;
int offset = 0;
bool done = false;
do
{
//synch logic...
// if there are rows found to have changed then send them to a queue for further processing
} while (!done);
// we are done syncing a vendor write out the vendorinfo
conn.Close();
}
log.LogInformation($"SynchVendor {vendor} Complete");
return totalCount;
對於額外的日志,你需要在你的 log.Log*** 操作前面添加:
if (!context.IsReplaying)
對於永遠看不到完成的問題,您可以執行以下操作:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.