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
我正在尝试在 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