我正在使用durable function
singleton pattern
on consumption plan
。我只想为队列消息中的相同 ID 执行该函数的一个实例。
我正在local
环境中测试我的代码。尽管函数成功完成,但 DurableOrchestrationClient.GetStatusAsync() 返回具有相同实例 ID 的实例仍在执行。
使用Storage Explorer
,我发现我的函数行Table>DurableFunctionHubInstances
RuntimeStatus
也被标记为Completed
。
为什么DurableOrchestrationClient.GetStatusAsync()
报告存在具有相同 Instance Id 的实例?我怎样才能解决这个问题?
[FunctionName("OF_QueueStart")]
public static async void QueueStart(
[QueueTrigger("queue-name", Connection = "connection")]MyObject req,
[OrchestrationClient]DurableOrchestrationClient starter,
ILogger log)
{
log.LogInformation("some logging here");
string instanceId = req.MyTenant + "-" + req.MyId;
log.LogInformation($"Checking if instance with instance ID {instanceId} already exists.");
var existingInstance = await starter.GetStatusAsync(instanceId);
if (existingInstance == null)
{
log.LogInformation($"Instance with instance ID {instanceId} does not exist.");
await starter.StartNewAsync("OF", instanceId, req);
log.LogInformation($"Started orchestration with ID = {instanceId}.");
}
else
{
log.LogInformation($"OF instance with Instance ID {instanceId} already exists.");
}
}
[FunctionName("OF")]
public static async void RunOrchestrator(
[OrchestrationTrigger] DurableOrchestrationContext context, ILogger log)
{
log.LogInformation($"Executing orchestration with instance id {context.InstanceId}");
var input = context.GetInput<MyObject>();
var myObject2= await context.CallActivityAsync<MyObject2>("OF_F1", input.MyTenant);
var myObject3 = await context.CallActivityAsync<MyObject3>("OF_F2", input.MyId);
SqlConnection conn = new SqlConnection(GetConnectionString(tenantInfo.DbConnection));
/*Here will call OF_F3 and pass conn as a parameter. Currently this line is not written*/
conn.Close();
}