Как отменить запущенную функцию запуска в пределах azure долговременных функций? - PullRequest
0 голосов
/ 23 января 2020

Я пробую разветвление, разветвление. Вот мой код

[FunctionName("af_cancellation")]
        public static async Task<string> RunOrchestrator(
            [OrchestrationTrigger] DurableOrchestrationContext context, ILogger log)
        {

            var taskList = new List<Task<string>>();
            var tokenSource = new CancellationTokenSource();

            taskList.Add(context.CallActivityAsync<string>("af_cancellation_Hello", new { ct = tokenSource.Token, city = "Tokyo" }));
            taskList.Add(context.CallActivityAsync<string>("af_cancellation_Hello", new { ct = tokenSource.Token, city = "Seattle" }));
            taskList.Add(context.CallActivityAsync<string>("af_cancellation_Hello", new { ct = tokenSource.Token, city = "London" }));


            try
            {
                await Task.WhenAll(taskList);
            }
            catch (FunctionException)
            {
                log.LogError("trigger function failed");
                tokenSource.Cancel();
            }

            string output = "";
            foreach (var t in taskList)
            {
                output += t.Result;
            }
            return output;
        }

Я хотел бы отменить все задачи в taskList, если какая-либо из них выдает исключение. Что я заметил, так это то, что ждут Task.WhenAll завершает все задачи, прежде чем двигаться вперед.

Вот пример функции триггера

[FunctionName("af_cancellation_Hello")]
        public static string SayHello([ActivityTrigger] DurableActivityContext context, ILogger log)
        {
            var data = context.GetInput<dynamic>();
            var name = (string)data.city;
            // unable to de-serialize cancellation token here but we'll ignore that. 
            var ct = JsonConvert.DeserializeObject<CancellationToken>(data.ct);
            if (name != "London")
            {
                System.Threading.Thread.Sleep(1000 * 30);
            }
            else
            {
                System.Threading.Thread.Sleep(1000 * 10);
                throw new FunctionException("don't like london");
            }
            log.LogInformation($"Saying hello to {name}.");
            return $"Hello {name}!";
        }

Как мне этого добиться?

1 Ответ

0 голосов
/ 23 января 2020

Согласно это Я думаю, что это невозможно. Если вам нужно отменить задание из других успешно выполненных заданий, вы должны взглянуть на шаблон Saga и запустить компенсирующие действия.

больше информации:

https://microservices.io/patterns/data/saga.html https://www.enterpriseintegrationpatterns.com/patterns/conversation/CompensatingAction.html

...