Я использую durable function
singleton pattern
на consumption plan
.Я хочу выполнить только один экземпляр функции для тех же идентификаторов в моих сообщениях очереди.
Я тестирую свой код в среде local
.Хотя функция завершается успешно, DurableOrchestrationClient.GetStatusAsync () возвращает, что экземпляр с тем же идентификатором экземпляра все еще выполняется.
Используя Storage Explorer
, я обнаружил, что строка моей функции в Table>DurableFunctionHubInstances
RuntimeStatus
также помечен как Completed
.
Почему DurableOrchestrationClient.GetStatusAsync()
сообщает, что существует экземпляр с таким же идентификатором экземпляра?Как я могу это исправить?
[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();
}