使用c#的 async/await编写 长时间运行的基于代码的工作流的 持久任务框架

2022-12-19 0 1,016

原副标题:采用c#的 async/await撰写 较长时间运转的如前所述标识符的组织工作流的 长久各项任务架构

长久各项任务架构 (DTF) 是如前所述async/await 组织工作流继续执行架构。组织工作流的软件系统许多,主要就包括Windows Workflow Foundation,BizTalk,Logic Apps,Workflow-Core Elsa-Core 。前段时间我在Dapr 的库房里追踪组织工作流构筑块的重大进展时,深入细致介绍了呵呵,这个DTFx在Azure 基础建设有大批的应用领域,那时Dapr项目组已经开始把那个课堂教学抽象化成组织工作流构筑块,具体内容参见https://github.com/dapr/dapr/issues/4576 。DTFx 刚好是.NET合作开发的,因此对他多了些许高度关注,从前没深入细致进上看一看,那时我真的是值得称赞所推荐给他们的两个组织工作流计划,它足够多轻量,因此比较简单,倚赖极少。

长久各项任务架构是两个开放源码架构,它为 .NET 网络平台中的组织工作流即标识符提供更多了基础。GitHub上:https://github.com/Azure/durabletask

它有三个主要就模块:流程和各项任务。流程“选曲”应用领域Monpazier,以上联形式继续执行自订标识符并调用各项任务。自订流程衍生自 TaskOrchestration<TResult, TInput>自订各项任务衍生自 TaskActivity<TInput, TResult>。

所推荐他们从这三个库房需用源自学和制造采用。

Microsoft.Extensions.Hosting包装袋器:https://github.com/jviau/durabletask-hosting

长久各项任务架构扩充:https://github.com/lucaslorentz/durabletask-extensions

他们一同上看下长久各项任务架构的Hello world:标识符源自https://github.com/jviau/durabletask-hosting 的 DurableTask.Samples:

那个比较简单的流程“GreetingsOrchestration”,有三个称作各项任务“GetUserTask”,它继续执行中文名称提示信息和“SendGreetingTask”,它将Perhaps载入控制面板。

GreetingsOrchestration 衍生自 TaskOrchestration<string、string> 并具有初始化 GetUserTask 和 SendGreetingTask 的 RunTask 方法。

using DurableTask.Core;

namespace DurableTask.Samples.Greetings;

/// <summary>

/// A task orchestration for greeting a user.

/// </summary>

public class GreetingsOrchestration : TaskOrchestration<string, string>

{

/// <inheritdoc />

public override async Task<string> RunTask(OrchestrationContext context, string input)

{

string user = await context.ScheduleTask<string>(typeof(GetUserTask));

string greeting = await context.ScheduleTask<string>(typeof(SendGreetingTask), user);

return greeting;

}

}

GetUserTask 衍生自 TaskActivity<string,string> 并实现了 Execute 方法

using DurableTask.Core;

namespace DurableTask.Samples.Greetings;

/// <summary>

/// A task activity for getting a username from console.

/// </summary>

public class GetUserTask : TaskActivity<string, string>

{

private readonly IConsole _console;

/// <summary>

/// Initializes a new instance of the <see cref=”GetUserTask”/> class.

/// </summary>

/// <param name=”console”>The console output helper.</param>

public GetUserTask(IConsole console)

{

_console = console ?? throw new ArgumentNullException(nameof(console));

}

/// <inheritdoc />

protected override string Execute(TaskContext context, string input)

{

_console.WriteLine(“Please enter your name:”);

return _console.ReadLine;

}

}

SendGreetingTask 衍生自 TaskActivity<string、string> 并实现了 Excute 方法

using DurableTask.Core;

namespace DurableTask.Samples.Greetings;

/// <summary>

/// A task for sending a greeting.

/// </summary>

public sealed class SendGreetingTask : AsyncTaskActivity<string, string>

{

private readonly IConsole _console;

/// <summary>

/// Initializes a new instance of the <see cref=”SendGreetingTask”/> class.

/// </summary>

/// <param name=”console”>The console output helper.</param>

public SendGreetingTask(IConsole console)

{

_console = console ?? throw new ArgumentNullException(nameof(console));

}

/// <inheritdoc />

protected override async Task<string> ExecuteAsync(TaskContext context, string user)

{

string message;

if (!string.IsNullOrWhiteSpace(user) && user.Equals(“TimedOut”))

{

message = “GetUser Timed out!!!”;

_console.WriteLine(message);

}

else

{

_console.WriteLine(“Sending greetings to user: ” + user + “…”);

await Task.Delay(5 * 1000);

message = “Greeting sent to ” + user;

_console.WriteLine(message);

}

return message;

}

}

上面的那个例子非常基础,他们在项目中要把它用起来就要用到那个扩充项目 https://github.com/lucaslorentz/durabletask-extensions。那个项目通过更多功能扩充长久各项任务架构,并使其更易于采用,目前还在合作开发过程中,尚未达到投入制造的程度。包含了下列这些功能,让你在任何地方都可以运转。

更多定义存储功能的接口 倚赖注入集成 EF Core MySql/PostgreSQL/SqlServer storages 分布式组织工作线程:允许在多个组织工作线程中拆分流程/活动实现 通过 GRPC 协议进行间接存储访问:将您的存储选择和配置集中在单个模块中。 用户界面 BPMN 运转器

在示例文件夹中,您可以找到经典书籍《飞行、汽车、酒店》的实现,其中包含补偿问题。

该示例旨在演示具有以下模块的微服务体系结构:

服务器: 连接到存储并将其公开为 GRPC 终结点。 应用领域程序接口: 公开 REST API 以管理流程。 用户界面: 公开用于管理流程的 UI。 流程组织工作线程: 为给定问题实现BookParallel和BookSquential流程。 飞行组织工作人员: 实施预订航班和取消航班活动。 车夫: 实施“预订汽车”和“取消汽车”活动。 酒店组织工作人员: 实施预订酒店和取消酒店活动。 BPMNWorker: 两个建立在长久各项任务之上的实验性 BPMN 运转器。对于给定的问题,还有BookParallel和BookSequentialBPMN 组织工作流。

使用c#的 async/await编写 长时间运行的基于代码的工作流的 持久任务框架

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务