使用计划自动编排定期任务

时间安排在固定间隔自动触发编排,而无需编写自己的轮询或计时器逻辑。 只需定义一个计划,而不是构建 永续编排 或外部 cron 作业。 Durable Task Scheduler 负责处理其他事务,并在指定的频率下执行您的编排任务,同时支持内置暂停、恢复和更新功能。

注意

目前仅在 Durable Task SDK for .NET 中支持调度。

何时使用计划

需要重复按固定间隔运行业务流程时,请使用计划。 常见方案包括:

  • 缓存清除:定期使缓存的数据失效或刷新。
  • 数据同步:定期从外部系统拉取数据。
  • 报表生成:生成每日、每小时或每周报表。
  • 健康检查:周期性地运行诊断编排。
  • 资源清理:定期清除过期资源或过期数据。

计划与永恒编排

计划和 永续编排 都支持定期工作,但它们在重要方面有所不同。

方面 Schedules 永恒的编排
间隔控件 以声明式方式配置。 调度器处理时间管理。 编写显式计时器和 ContinueAsNew 逻辑。
暂停和恢复 内置 API 支持 需要通过外部事件进行自定义实现
运行时更新 在不重新部署的情况下更新间隔、输入或目标编排 需要更改代码并重新部署
管理 创建、列出、描述、更新和删除 ScheduledTaskClient 通过 DurableTaskClient 实例管理 API 进行管理
编排历史 每个触发器创建一个独立的编排实例 具有 ContinueAsNew 的长时间运行的单个实例

在需要声明性、可管理的定期执行时选择计划。 当重复逻辑是动态的,或者取决于之前迭代的结果时,请选择持久编排。

先决条件

启用计划任务的功能

若要使用调度,在主机设置期间同时在工作程序和客户端生成器上调用 UseScheduledTasks()。 此方法在依赖项注入容器中注册内部计划实体和服务 ScheduledTaskClient

using Microsoft.DurableTask.Client.AzureManaged;
using Microsoft.DurableTask.ScheduledTasks;
using Microsoft.DurableTask.Worker.AzureManaged;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);

string connectionString = builder.Configuration
    .GetValue<string>("DURABLE_TASK_SCHEDULER_CONNECTION_STRING")
    ?? throw new InvalidOperationException(
        "Missing required configuration 'DURABLE_TASK_SCHEDULER_CONNECTION_STRING'");

// Configure the worker
builder.Services.AddDurableTaskWorker(b =>
{
    b.AddTasks(r => r.AddAllGeneratedTasks());
    b.UseDurableTaskScheduler(connectionString);
    b.UseScheduledTasks();
});

// Configure the client
builder.Services.AddDurableTaskClient(b =>
{
    b.UseDurableTaskScheduler(connectionString);
    b.UseScheduledTasks();
});

IHost host = builder.Build();
await host.StartAsync();

安装后,注入 ScheduledTaskClient 以创建和管理计划。

创建计划

使用 ScheduleCreationOptions 定义计划的 ID、目标业务流程和重复间隔。 然后调用 CreateScheduleAsync 以注册它。

using Microsoft.DurableTask.ScheduledTasks;

ScheduleCreationOptions options = new(
    scheduleId: "stock-price-check",
    orchestrationName: nameof(StockPriceOrchestrator),
    interval: TimeSpan.FromSeconds(30))
{
    OrchestrationInput = "MSFT",
    StartAt = DateTimeOffset.UtcNow,
    StartImmediatelyIfLate = true
};

ScheduleClient scheduleClient = await scheduledTaskClient.CreateScheduleAsync(options);

下表描述了 ScheduleCreationOptions 属性。

财产 类型 必需 Description
ScheduleId string 是的 计划的唯一标识符。
OrchestrationName string 是的 在每个时间间隔触发的协调程序的名称。
Interval TimeSpan 是的 每次编排执行之间的时间。
OrchestrationInput object? 每次运行时传递到编排的输入数据。
StartAt DateTimeOffset? 当日程处于活动状态时。 默认为立即。
EndAt DateTimeOffset? 当计划停止触发时。 无默认值(无限期运行)。
StartImmediatelyIfLate bool 如果 true,当计划错过其触发时间时,会立即运行协调。

管理时间表

创建计划后,使用 ScheduleClient 句柄暂停、恢复、更新、描述或删除它。

获取计划详细信息

获取计划的当前状态和配置。

ScheduleDescription description = await scheduleClient.DescribeAsync();

Console.WriteLine($"Schedule ID: {description.ScheduleId}");
Console.WriteLine($"Status: {description.Status}");
Console.WriteLine($"Interval: {description.Interval}");

暂停和恢复

暂时停止调度以触发新的编排,然后稍后恢复。

// Pause the schedule
await scheduleClient.PauseAsync();

// Resume the schedule
await scheduleClient.ResumeAsync();

暂停计划不会影响已运行的编排实例。

更新计划

更改现有计划的间隔、调度目标、输入或时间窗口,而无需删除和重新创建计划。

ScheduleUpdateOptions updateOptions = new()
{
    Interval = TimeSpan.FromMinutes(5),
    OrchestrationInput = "AAPL",
    EndAt = DateTimeOffset.UtcNow.AddDays(7)
};

await scheduleClient.UpdateAsync(updateOptions);

删除日程

永久删除日程。 此操作不会影响已启动的编排实例。

await scheduleClient.DeleteAsync();

列出计划

使用ListSchedulesAsync列出任务中心中注册的所有计划。

AsyncPageable<ScheduleDescription> schedules = scheduledTaskClient.ListSchedulesAsync();

await foreach (ScheduleDescription schedule in schedules)
{
    Console.WriteLine($"{schedule.ScheduleId}: {schedule.Status}");
}

传递一个ScheduleQuery来控制页面大小。

ScheduleQuery query = new() { PageSize = 50 };
AsyncPageable<ScheduleDescription> schedules = scheduledTaskClient.ListSchedulesAsync(query);

按 ID 获取日程

根据其 ID 检索特定计划,而无需原始 ScheduleClient 句柄。

ScheduleDescription? schedule = await scheduledTaskClient.GetScheduleAsync("stock-price-check");

还可以获取 ScheduleClient 现有计划的句柄:

ScheduleClient existingClient = scheduledTaskClient.GetScheduleClient("stock-price-check");
ScheduleDescription description = await existingClient.DescribeAsync();

监控时间表

使用 Durable Task Scheduler 仪表板监视计划的编排。 仪表板显示计划触发的每个业务流程实例,包括状态、持续时间、输入和输出。

Samples

探索展示日程操作的完整工作示例。

  • 计划控制台应用:演示如何在控制台应用程序中创建、暂停、恢复、删除和列出计划。

后续步骤