Azure 持久编排 - LockAsync

Azure Durable Orchestration - LockAsync

我正在尝试在 Azure 持久编排中进行一些锁定操作。 但是我不知道如何锁定实体。

让我们考虑这个简单的例子:

public class Function1
{
    [FunctionName(nameof(RunLockOrchestratorHttp))]
    public async Task<IActionResult> RunLockOrchestratorHttp(
        [HttpTrigger(AuthorizationLevel.Function, "post", Route = "RunLockOrchestratorHttp")] HttpRequest req,
        [DurableClient] IDurableOrchestrationClient starter)
    {
        string id = await starter.StartNewAsync(nameof(LockOrchestrator), null, "two");
        return new OkObjectResult($"LockOrchestrator started with id {id}");
    }

    [FunctionName(nameof(LockOrchestrator))]
    public async Task LockOrchestrator([OrchestrationTrigger] IDurableOrchestrationContext context)
    {
        var ctx = context.GetInput<string>();

        Console.WriteLine($"LockOrchestrator {context.InstanceId} with context {ctx} : START");

        // Create a locker according to context
        var entity = new EntityId(nameof(LockOrchestrator), ctx);
        using (var locker = await context.LockAsync(entity))
        {
            // Never enter here
            Console.WriteLine($"LockOrchestrator {context.InstanceId} : lock {entity.EntityName}_{entity.EntityKey} obtained");
            await context.CallActivityAsync(nameof(Activity), ctx);
        }
        Console.WriteLine($"LockOrchestrator {context.InstanceId} : lock {entity.EntityName}_{entity.EntityKey} released");
    }

    public async Task Activity([ActivityTrigger] string ctx)
    {
        switch (ctx)
        {
            case "one":
                Console.WriteLine($"Activity : wait one");
                await Task.Delay(10000);
                break;
            case "two":
                Console.WriteLine($"Activity : wait two");
                await Task.Delay(20000);
                break;
            default:
                Console.WriteLine($"Activity : wait default");
                await Task.Delay(1000);
                break;
        }
    }
}

当我运行这段代码时,我可以看到日志

LockOrchestrator e0c1698674a14b8191faabb7fd3eca69 上下文二:START

但是什么也没有,我从不在 using{} 语句中输入,我在其中放置注释 // Never enter here

我错过了什么?

提前致谢!

我看到您正试图锁定一个实体,但是我没有看到该实体的定义。您必须首先定义基于 class 或基于函数的实体。

例如,如果您定义一个名为 Counter 的实体 class,您的代码将起作用。

[JsonObject(MemberSerialization.OptIn)]
public class Counter
{
    [JsonProperty("value")]
    public int Value { get; set; }

    [FunctionName(nameof(Counter))]
    public static Task Run([EntityTrigger] IDurableEntityContext ctx)
        => ctx.DispatchAsync<Counter>();
}

将您的实体实例化为:

 // Create a locker according to context
    var entity = new EntityId("Counter", ctx);

此外,为您的 activity 函数添加 FunctionName 注释以避免 运行 时间错误。

[FunctionName("Activity")]
public async Task Activity([ActivityTrigger] string ctx)

现在这只是实体 class 的示例。根据您的需要定义实体 class 并尝试一下。

您可能想在此处阅读有关持久实体的更多信息 https://docs.microsoft.com/en-us/azure/azure-functions/durable/durable-functions-dotnet-entities