时间安排在固定间隔自动触发编排,而无需编写自己的轮询或计时器逻辑。 只需定义一个计划,而不是构建 永续编排 或外部 cron 作业。 Durable Task Scheduler 负责处理其他事务,并在指定的频率下执行您的编排任务,同时支持内置暂停、恢复和更新功能。
注意
目前仅在 Durable Task SDK for .NET 中支持调度。
何时使用计划
需要重复按固定间隔运行业务流程时,请使用计划。 常见方案包括:
- 缓存清除:定期使缓存的数据失效或刷新。
- 数据同步:定期从外部系统拉取数据。
- 报表生成:生成每日、每小时或每周报表。
- 健康检查:周期性地运行诊断编排。
- 资源清理:定期清除过期资源或过期数据。
计划与永恒编排
计划和 永续编排 都支持定期工作,但它们在重要方面有所不同。
| 方面 | Schedules | 永恒的编排 |
|---|---|---|
| 间隔控件 | 以声明式方式配置。 调度器处理时间管理。 | 编写显式计时器和 ContinueAsNew 逻辑。 |
| 暂停和恢复 | 内置 API 支持 | 需要通过外部事件进行自定义实现 |
| 运行时更新 | 在不重新部署的情况下更新间隔、输入或目标编排 | 需要更改代码并重新部署 |
| 管理 | 创建、列出、描述、更新和删除 ScheduledTaskClient |
通过 DurableTaskClient 实例管理 API 进行管理 |
| 编排历史 | 每个触发器创建一个独立的编排实例 | 具有 ContinueAsNew 的长时间运行的单个实例 |
在需要声明性、可管理的定期执行时选择计划。 当重复逻辑是动态的,或者取决于之前迭代的结果时,请选择持久编排。
先决条件
- .NET 8 SDK 或更高版本
- 用于运行 Durable Task Scheduler 模拟器的 Docker
-
Microsoft.DurableTask.Worker.AzureManaged和Microsoft.DurableTask.Client.AzureManagedNuGet 包
启用计划任务的功能
若要使用调度,在主机设置期间同时在工作程序和客户端生成器上调用 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
探索展示日程操作的完整工作示例。
- 计划控制台应用:演示如何在控制台应用程序中创建、暂停、恢复、删除和列出计划。