DurableOrchestrationClient.GetStatusAsync () возвращает, что экземпляр с тем же идентификатором экземпляра все еще выполняется даже после его завершения - PullRequest
0 голосов
/ 11 февраля 2019

Я использую 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();
}

1 Ответ

0 голосов
/ 11 февраля 2019

Кажется, что existingInstance заполнен строкой из таблицы DurableFunctionHubInstances, имеющей тот же Partition Key.Нам нужно проверить, что это RuntimeStatus.

    var existingInstance = await starter.GetStatusAsync(instanceId);
    if (existingInstance == null || existingInstance.RuntimeStatus == OrchestrationRuntimeStatus.Completed)
    {
        log.LogInformation($"Instance with instance ID {instanceId} does not exist.");
        await starter.StartNewAsync("OF", instanceId, req);
        log.LogInformation($"Started orchestration with ID = {instanceId}.");
    }
...