Azure functions IDurableOrchestrationContext.SetCustomStatus不会立即更新状态
目标是使用IDurableOrchestrationContext.SetCustomStatus调用更新编排器的自定义状态。 下面是代码示例,但该点在开始时设置为自定义状态(“检查”)。检查是否有任何“正在运行”或“正在检查”的实例 在下面的例子中,我设置了自定义状态并立即检查它(在将来,如果有实例正在运行,管弦乐队将暂停,稍后再次检查,等待轮到它) 问题在于:如果我在设置状态后立即检查状态(使用.listInstanceAsync()API),则不会返回具有自定义状态的实例。。。 如果我在调用之间放置一些活动(设置状态和获取状态),我就能够获得正确的实例 似乎IDurableOrchestrationContext.SetCustomStatus调用需要一些时间来实际设置Azure存储表中的自定义状态。。。在此处设置/获取自定义状态的推荐方法是什么?Azure functions IDurableOrchestrationContext.SetCustomStatus不会立即更新状态,azure-functions,Azure Functions,目标是使用IDurableOrchestrationContext.SetCustomStatus调用更新编排器的自定义状态。 下面是代码示例,但该点在开始时设置为自定义状态(“检查”)。检查是否有任何“正在运行”或“正在检查”的实例 在下面的例子中,我设置了自定义状态并立即检查它(在将来,如果有实例正在运行,管弦乐队将暂停,稍后再次检查,等待轮到它) 问题在于:如果我在设置状态后立即检查状态(使用.listInstanceAsync()API),则不会返回具有自定义状态的实例。。。 如果我在调
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");
}
}
公共静态类Class1
{
[函数名(名称(TriggerAsync))]
公共静态异步任务触发器同步(
[DurableClient]IDurableOrchestrationClient orchestrationClient,
//[TimerTrigger(“0*/1****”)TimerInfo计时器,
[HttpTrigger(AuthorizationLevel.Function,“get”,“post”,Route=null)]HttpRequest请求,
ILogger(记录器)
{
logger.LogWarning(“触发器.启动新业务流程”);
var id=await orchestrationClient.StartNewAsync(nameof(OrchestrationAsync));
logger.LogWarning(“触发器.启动新业务流程”);
}
[函数名(名称(OrchestrationAsync))]
公共静态异步任务编排同步(
[OrchestrationTrigger]IDurableOrchestrationContext上下文,
[DurableClient]IdurableCorchestrationClient启动器,
ILogger日志)
{
var logger=context.createReplaySafeloger(日志);
尝试
{
context.SetCustomStatus(“超级”);
logger.LogWarning($“Orchestration.GetInstances Start”);
var instances=await context.CallActivityAsync(“GetInstances”,null);
logger.LogWarning($“Orchestration.GetInstances结果:{instances}”);
logger.LogWarning($“Orchestration.GetInstances End”);
logger.LogWarning($“Orchestration.Activity1 Start”);
wait context.CallActivityAsync(“Activity1”,null);
logger.LogWarning($“Orchestration.Activity1 End”);
}
抓住
{
logger.LogWarning($“Orchestration.Error”);
投掷;
}
logger.LogWarning($“Orchestration.Done”);
}
[功能名称(活动名称1))]
公共静态异步任务活动1(
[ActivityTrigger]IDurableActivityContext上下文,
[DurableClient]IdurableCorchestrationClient启动器,
ILogger(记录器)
{
var rnd=新随机数();
var rndNum=rnd.Next(60);
logger.LogWarning($“Activity.do some work with{rndNum}seconds duration”);
等待任务延迟(新的时间跨度(0,0,rndNum));
}
[FunctionName(nameof(GetInstances))]
公共静态异步任务GetInstances(
[ActivityTrigger]IDurableActivityContext上下文,
[DurableClient]IdurableCorchestrationClient启动器,
ILogger(记录器)
{
变量状态=新列表
{
OrchestrationRuntimeStatus.Running,
OrchestrationRuntimeStatus.Pending
};
var条件=新业务流程statusquerycondition
{
RuntimeStatus=状态
};
var response=await starter.listInstanceAsync(条件,CancellationToken.None);
返回response.DurableOrchestrationState.Count(x=>x.CustomStatus.ToString()==“超级”);
}
}
您的编排器似乎至少违反了其中一条规则,它不应该阻塞异步任务。框架很可能会在下次从函数返回执行时设置状态(wait/return)。你最终想要实现什么?@juunas,更新一下我的例子。由httpTrigger触发,另外我将GetInstances调用包装到一个活动中,现在使用wait,所以它不会阻止任何东西。但是结果是一样的-GetInstances活动不返回任何具有自定义状态的实例,但是状态是在GetInstances调用之前设置的…是的,现在看起来更正确了,必须查看DF源代码,以查看它在内部对该自定义状态的实际操作。如果我记得函数本身只是序列化了您提供的输入,并设置了一些字段。@juunas,非常感谢您的帮助@juunas,如果我在github上的QA中直接询问同样的问题,会有帮助吗-