目标是使用 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");
}
}