启动任务
在许多情况下,一旦silo可用,就需要自动执行某些任务。启动任务提供此功能。
一些用例包括但不限于:
- 启动后台计时器,以执行周期性的"家务"式的任务
- 使用从外部的后备存储下载的数据,预加载一些缓存的grain
启动期间从启动任务抛出的任何异常,都会报告在silo日志中,并停止silo。
这种快速失败的方法是Orleans处理silo启动问题的标准方法,旨在允许在测试阶段,轻松检测到silo的配置和/或引导逻辑的任何问题,而不是被静默忽略,并在以后的silo生命周期中导致意外问题。
配置启动任务
可以使用ISiloHostBuilder
注册一个要在启动期间调用的委托,或注册一个IStartupTask
的实现,来配置启动任务。
示例:注册一个委托
siloHostBuilder.AddStartupTask(
async (IServiceProvider services, CancellationToken cancellation) =>
{
// Use the service provider to get the grain factory.
var grainFactory = services.GetRequiredService<IGrainFactory>();
// Get a reference to a grain and call a method on it.
var grain = grainFactory.GetGrain<IMyGrain>(0);
await grain.Initialize();
});
示例:注册一个IStartupTask
的实现
首先,我们必须定义一个IStartupTask
的实现:
public class CallGrainStartupTask : IStartupTask
{
private readonly IGrainFactory grainFactory;
public CallGrainStartupTask(IGrainFactory grainFactory)
{
this.grainFactory = grainFactory;
}
public async Task Execute(CancellationToken cancellationToken)
{
var grain = this.grainFactory.GetGrain<IMyGrain>(0);
await grain.Initialize();
}
}
然后,必须用ISiloHostBuilder
来注册该实现:
siloHostBuilder.AddStartupTask<CallGrainStartupTask>();