`Coravel`不仅可以执行后台定时程序,还具备队广播事件功能。
引用
```
```
# 后台定时程序
如果执行后台定时程序,需要定义一个`IInvocable`对象
```
public class RegisterDevices : IInvocable
{
ublic async System.Threading.Tasks.Task Invoke()
{
}
}
```
注入到容器中
```
services.AddScheduler();//计划
services.AddQueue();//队列
services.AddEvents();//广播
services.AddTransient();//注册IInvocable
```
在请求管道中配置 频率等行为
```
var provider = app.ApplicationServices; ;//获取IServiceProvider
provider.UseScheduler(s =>
{
#region 本地相关
//更新所有模块的上传频率
s.OnWorker("WRegisterDevices");//让任务之间并行不会有延时影响
s.Schedule()
.Cron("*/1 * * * *")//每1分钟运行一次
.PreventOverlapping("RegisterDevices");//当第一次执行不完,第二次就不执行
})
.OnError(exception =>
{
Console.WriteLine(exception.Message);
});
```
# 事件广播
`Coravel`会把事件放队列中,依次执行。
定义事件。
```
public class SceneExecuted : IEvent
{
public SceneArgs SceneArgs { get; set; }
public SceneExecuted(SceneArgs sceneArgs)
{
SceneArgs = sceneArgs;
}
}
public class SceneArgs
{
public string SceneId { get; set; }
public string SceneScheduleId { get; set; }
public string StartTime { get; set; }
}
```
定义事件观察者。
```
public class SceneExecuteListener : IListener
{
public async System.Threading.Tasks.Task HandleAsync(SceneExecuted broadcasted)
{
}
}
```
在容器中注册
```
services.AddTransient(); //IEvent
services.AddTransient();//IListener
services.AddTransient();
```
在请求管道中定义事件行为
```
//事件
IEventRegistration registration = provider.ConfigureEvents();
//场景的执行情况上传到云端,cloudgo=1时执行
registration
.Register()
.Subscribe();
//队列
provider
.ConfigureQueue()
//.LogQueuedTaskProgress(Services.GetService>())
.OnError(exception =>
{
Console.WriteLine(exception.Message);
});
```
在`appsettings.json`中定义队列间隔
```
"Coravel": {
"Queue": {
"ConsummationDelay": 30 //队列项的等待时间
}
}
```