c# - 如何在 Durable Functions 中中止 [ActivityTrigger] 函数

标签 c# azure-durable-functions

我有一个 [DurableOrchestrationClient],它启动一个 [OrchestrationTrigger],它启动一个长时间运行的 [ActivityTrigger] 函数。
我知道如何使用 TerminateAsync() 来终止 [OrchestrationTrigger] 的运行。

问题是当我终止 [OrchestrationTrigger] 函数时 [ActivityTrigger] 没有中止。 [ActivityTrigger] 一直运行直到完成。
当我调用 TerminateAsync() 时,我需要一种方法来中止长时间运行的 [ActivityTrigger]。

我的猜测是我可以将 CancellationToken 传递给 [ActivityTrigger] 函数,然后检查 cancellationToken.IsCancellationRequested 以中止。
但是如何做到这一点呢?

这里是测试代码


        [FunctionName("A_ProcessPayment")]
        public static async Task<processTracker> A_ProcessPayment(
            [ActivityTrigger] DurableActivityContext context, 
            TraceWriter log,
            CancellationToken cancellationToken)
        {
            processTracker p = context.GetInput<processTracker>();

            try
            {
                for (int i = 0; i < 5; i++){
                    if (cancellationToken.IsCancellationRequested) // This is always false! 
                    {
                        break;  
                    }

                    Trace.WriteLine("Long task loop: " + i);
                    await Task.Delay(10000);
                }
            }
            catch (OperationCanceledException) {
                log.Warning("C# HTTP trigger function canceled.");
                return p;
            }

            Trace.WriteLine("Long task DONE");
            return p;
        }

最佳答案

更新:

您可以选择将 token 作为对象传递给事件触发器,如下所示:

using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Logging;

namespace OrchesterTrigger
{
    public static class Function1
    {
        [FunctionName("Function1")]
        public static async Task<List<string>> RunOrchestrator(
            [OrchestrationTrigger] DurableOrchestrationContext context)
        {
            var outputs = new List<string>();
            string mytoken = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
            outputs.Add(await context.CallActivityAsync<string>("Function1", mytoken));
            return outputs;
        }

        [FunctionName("Function1")]
        public static string SayHello([ActivityTrigger] string mytoken, ILogger log)
        {
            log.LogInformation($"Mytoken is {mytoken}.=======================================");
            return $"Mytoken is {mytoken}!";
        }

        [FunctionName("Function1_HttpStart")]
        public static async Task<HttpResponseMessage> HttpStart(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")]HttpRequestMessage req,
            [OrchestrationClient]DurableOrchestrationClient starter,
            ILogger log)
        {
            // Function input comes from the request content.
            string instanceId = await starter.StartNewAsync("Function1", null);

            log.LogInformation($"================================Started orchestration with ID = '{instanceId}'.");

            return starter.CreateCheckStatusResponse(req, instanceId);
        }
    }
}

我展示的是传入一个字符串类型的值,你可以替换成你想要的类型,它是类型兼容的。

原答案:

事件触发器一旦启动就无法停止。您可以选择将步骤分解为更多步骤。

看看 offcial doc .事件函数和子编排将运行完成,无论您是否终止了调用它们的编排实例。

关于c# - 如何在 Durable Functions 中中止 [ActivityTrigger] 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59431914/

相关文章:

c# - 动态库仅包含元数据,没有类型

postgresql - Azure Function 创建了太多与 PostgreSQL 的连接

c# - Azure Durable Function Orchestration GetInput 不起作用

c# - 使用超时模式锁定

c# - SemaphoreSlim 没有限制任务

c# - 以不同于 GET 的方式处理 POST

Azure 耐用功能 想要高吞吐量/低延迟?

azure - 如何查看运行状态并停止耐用功能

python - Azure Durable 函数 python DurableOrchestrationContext get_input 返回 null

c# - 如何使用 AWS CDK 将 "PolicyDocument"对象附加到 TopicPolicy?