IDurableOrchestrationContext.SetCustomStatus 不会立即更新状态

时间:2021-04-22 15:07:15

标签: azure-functions

目标是使用 IDurableOrchestrationContext.SetCustomStatus 调用更新编排器的自定义状态。 代码示例如下,但该点在其开始时设置为自定义状态(“正在检查”)。检查是否有任何“正在运行”或“正在检查”实例。

在下面的示例中,我设置了自定义状态并立即检查(如果有实例正在运行,以后的编排器将暂停并稍后再次检查,等待轮到它) 问题是:如果我在设置状态后立即检查状态(使用 .ListInstancesAsync() API) - 我的自定义状态没有返回任何实例...... 如果我在调用之间放置一些活动(设置状态并获取它),我就能获得正确的实例。

似乎 IDurableOrchestrationContext.SetCustomStatus 调用需要一些时间才能在 Azure 存储表中实际设置自定义状态...此处设置/获取自定义状态的推荐方法是什么?

public static class Class1
{
    [FunctionName(nameof(TriggerAsync))]
    public static async Task TriggerAsync(
        [DurableClient] IDurableOrchestrationClient orchestrationClient,
        //[TimerTrigger("0 */1 * * * *")] TimerInfo timer,
        [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
        ILogger logger)
    {
        logger.LogWarning("Trigger. Starting new orchestration");
        var id = await orchestrationClient.StartNewAsync(nameof(OrchestrationAsync));
        logger.LogWarning("Trigger. Started new orchestration");
    }

    [FunctionName(nameof(OrchestrationAsync))]
    public static async Task OrchestrationAsync(
        [OrchestrationTrigger] IDurableOrchestrationContext context,
        [DurableClient] IDurableOrchestrationClient starter,
        ILogger log)
    {
        var logger = context.CreateReplaySafeLogger(log);

        try
        {
            context.SetCustomStatus("Superb");

            logger.LogWarning($"Orchestration. GetInstances Start");
            var instances = await context.CallActivityAsync<int>("GetInstances", null);
            logger.LogWarning($"Orchestration. GetInstances result: {instances}");
            logger.LogWarning($"Orchestration. GetInstances End");

            logger.LogWarning($"Orchestration. Activity1 Start");
            await context.CallActivityAsync("Activity1", null);
            logger.LogWarning($"Orchestration. Activity1 End");
        }
        catch
        {
            logger.LogWarning($"Orchestration. Error");
            throw;
        }

        logger.LogWarning($"Orchestration. Done");
    }

    [FunctionName(nameof(Activity1))]
    public static async Task Activity1(
        [ActivityTrigger] IDurableActivityContext context,
        [DurableClient] IDurableOrchestrationClient starter,
        ILogger logger)
    {
        var rnd = new Random();
        var rndNum = rnd.Next(60);

        logger.LogWarning($"Activity. Doing some work with {rndNum} seconds duration");
        await Task.Delay(new TimeSpan(0, 0, rndNum));
    }

    [FunctionName(nameof(GetInstances))]
    public static async Task<int> GetInstances(
        [ActivityTrigger] IDurableActivityContext context,
        [DurableClient] IDurableOrchestrationClient starter,
        ILogger logger)
    {
        var statuses = new List<OrchestrationRuntimeStatus>
        {
            OrchestrationRuntimeStatus.Running,
            OrchestrationRuntimeStatus.Pending
        };

        var condition = new OrchestrationStatusQueryCondition
        {
            RuntimeStatus = statuses
        };

        var response = await starter.ListInstancesAsync(condition, CancellationToken.None);
        return response.DurableOrchestrationState.Count(x => x.CustomStatus.ToString() == "Superb");
    }
}

0 个答案:

没有答案