如何以 WebJobs 的形式运行 Durable Functions

Azure FunctionsDurable Functions 扩展构建在 WebJobs SDK 基础之上。 WebJobs SDK 中的 JobHost 是 Azure Functions 中的运行时。 如果需要以 Azure Functions 中做不到的方式控制 JobHost 的行为,可以使用 WebJobs SDK 自行开发并运行 Durable Functions。 然后,可以在 Azure WebJob 或运行控制台应用程序的任何位置运行 Durable Functions。

WebJobs SDK 版本中提供了有关链接 Durable Functions 的示例:下载或克隆 Durable Functions 存储库,并导航到 samples\webjobssdk\chaining 文件夹。

先决条件

本文假定读者熟悉 WebJobs SDK、Azure Functions C# 类库开发和 Durable Functions 的基础知识。 如需这些主题的简介,请参阅以下资源:

完成本文中的步骤:

WebJobs SDK 版本

本文介绍如何开发 WebJobs SDK 2.x 项目(等效于 Azure Functions 版本 1.x)。 有关版本 3.x 的信息,请参阅本文稍后的 WebJobs SDK 3.x

创建控制台应用

WebJobs SDK 项目只是一个装有相应 NuGet 包的控制台应用项目。

在 Visual Studio 的“新建项目”对话框中,选择“Windows 经典桌面”>“控制台应用(.NET Framework)”。 在项目文件中,TargetFrameworkVersion 应为 v4.6.1

Visual Studio 还有一个 WebJob 项目模板,选择“云”>“Azure WebJob (.NET Framework)”即可使用此模板。 此模板会安装许多的包,其中一些包可能并不需要。

安装 NuGet 包

需要 WebJobs SDK 的 NuGet 包、核心绑定、日志记录框架和 Durable Task 扩展。 下面是这些包的“包管理器控制台”命令,并提供了截至编写本文时的最新稳定版本号:

Install-Package Microsoft.Azure.WebJobs.Extensions -version 2.2.0
Install-Package Microsoft.Extensions.Logging -version 2.0.1
Install-Package Microsoft.Azure.WebJobs.Extensions.DurableTask -version 1.4.0

以下命令安装控制台提供程序:

Install-Package Microsoft.Extensions.Logging.Console -version 2.0.1

JobHost 代码

若要使用 Durable Functions 扩展,请对 Main 方法中的 JobHostConfiguration 对象调用 UseDurableTask

var config = new JobHostConfiguration();
config.UseDurableTask(new DurableTaskExtension
{
    HubName = "MyTaskHub",
};

有关可在 DurableTaskExtension 对象中设置的属性列表,请参阅 host.json

函数

与针对 Azure Functions 服务编写的代码相比,针对 WebJobs SDK 函数编写的代码存在一些差异。

WebJobs SDK 不支持以下 Azure Functions 功能:

FunctionName 属性

在 WebJobs SDK 项目中,函数的方法名称是函数名称。 FunctionName 属性只能在 Azure Functions 中使用。

HTTP 触发器

WebJobs SDK 没有 HTTP 触发器。 示例项目的业务流程客户端使用计时器触发器:

public static async Task CronJob(
    [TimerTrigger("0 */2 * * * *")] TimerInfo timer,
    [OrchestrationClient] DurableOrchestrationClient client,
    ILogger logger)
{
  ...
}

HTTP 管理 API

由于没有 HTTP 触发器,WebJobs SDK 没有 HTTP 管理 API

在 WebJobs SDK 项目中,可对业务流程客户端对象调用方法,而无需发送 HTTP 请求。 以下方法对应于可以使用 HTTP 管理 API 执行的三个任务:

  • GetStatusAsync
  • RaiseEventAsync
  • TerminateAsync

示例项目中的业务流程客户端函数启动业务流程协调程序函数,然后进入每隔 2 秒调用 GetStatusAsync 的循环:

string instanceId = await client.StartNewAsync(nameof(HelloSequence), input: null);
logger.LogInformation($"Started new instance with ID = {instanceId}.");

DurableOrchestrationStatus status;
while (true)
{
    status = await client.GetStatusAsync(instanceId);
    logger.LogInformation($"Status: {status.RuntimeStatus}, Last update: {status.LastUpdatedTime}.");

    if (status.RuntimeStatus == OrchestrationRuntimeStatus.Completed ||
        status.RuntimeStatus == OrchestrationRuntimeStatus.Failed ||
        status.RuntimeStatus == OrchestrationRuntimeStatus.Terminated)
    {
        break;
    }

    await Task.Delay(TimeSpan.FromSeconds(2));
}

运行示例

本部分概述如何运行示例项目。 有关如何在本地运行 WebJobs SDK 项目并将其部署到 Azure WebJob 的详细说明,请参阅 WebJobs SDK 入门

在本地运行

  1. 确保存储模拟器正在运行(参阅先决条件)。

  2. 运行该项目。

后续步骤

若要详细了解 WebJobs SDK,请参阅如何使用 WebJobs SDK