在一些场景下档silo上线的时候应用想要运行一些“自动执行”的功能。
包括却不限于这些例子: * 启动后台计时器来定期执行管理任务 * 用从外部后端存储下载的数据预加载一些缓存grain
我们现在通过配置Orleans silo的“引导提供者”添加自动运行功能的支持。例如:
<OrleansConfiguration xmlns="urn:orleans">
<Globals>
<BootstrapProviders>
<Provider Type="My.App.BootstrapClass1" Name="bootstrap1" />
<Provider Type="My.App.BootstrapClass2" Name="bootstrap2" />
</BootstrapProviders>
</Globals>
</OrleansConfiguration>
也可以通过编码注册引导提供者,通过调用一下其一:
public void RegisterBootstrapProvider(string providerTypeFullName, string providerName, IDictionary<string, string> properties = null)
public void RegisterBootstrapProvider<T>(string providerName, IDictionary<string, string> properties = null) where T : IBootstrapProvider
在Orleans.Runtime.Configuration.GlobalConfiguration类中。
这个引导提供者是一个实现了Orleans.Providers.IBootstrapProvider接口的C#类。
当每个silo启动的时候,Orleans运行时会实例化每一个列出的引导类,之后在核实的运行时执行上下文中调用他们的Init方法,这样这些类可以作为一个客户端并且发送消息给grain。
Task Init(
string name,
IProviderRuntime providerRuntime,
IProviderConfiguration config)
任何一个引导提供者的Init方法抛出的异常都会被Orleans运行时记录在silo的log中,然后silo的启动会被暂停。
这种快速失败的方法是Orleans处理silo启动问题的标准方法,并且为了任何silo的配置和/或引导逻辑的问题在测试期间容易被检测到而不是默默忽略并且之后在silo生命周期中引起不可预料的问题。