.net任务调度库Coravel使用

95 阅读1分钟

官网

ABP框架下的使用

1、在.Host文件中

下面的代码是每天某个时间点,执行一次AutoCleanMessage类中的任务

//增加定时任务
context.Services.AddScheduler();
context.Services.AddTransient<AutoCleanMessage>();

//定期清理消息
app.ApplicationServices.UseScheduler(scheduler =>
{
    scheduler.Schedule<AutoCleanMessage>()
        //这个是utc时间,需要加8小时才是北京时间
        .DailyAt(18, 00);

    scheduler
        .Schedule<SendWelcomeUserEmail>()
        .DailyAt(13, 30)
        //按照本地时区执行
        .Zoned(TimeZoneInfo.Local);

    scheduler
        .Schedule(() => DoSomeStuff())
        .EveryMinute()
         //满足某种条件执行
        .When(SomeMethodThatChecksStuff);

    scheduler
        .Schedule<SomeInvocable>()
        .EveryMinute()
        //忽略重叠的任务,下一个任务到期但是上一个任务还没有执行完时使用
        .PreventOverlapping("SomeInvocable");
});

provider.UseScheduler(scheduler =>
    // Assign your schedules
)
.OnError((exception) =>
	//全剧错误处理
    DoSomethingWithException(exception)
);

使用工作组

//EmailTasks工作组:SendNightlyReportsEmailJob SendPendingNotifications
//共享一个专用的线程、管道,也可以称为自己的worker
scheduler.OnWorker("EmailTasks");
scheduler
    .Schedule<SendNightlyReportsEmailJob>().Daily();
scheduler
    .Schedule<SendPendingNotifications>().EveryMinute();

//CPUIntensiveTasks工作组:RebuildStaticCachedData
//不同工作组有自己的专用工作线程,因此如果运行时间较长,它也不会影响其他任务
scheduler.OnWorker("CPUIntensiveTasks");
scheduler
    .Schedule<RebuildStaticCachedData>().Hourly();

2、在Invoke方法中,是要执行的任务

public class AutoCleanMessage : IInvocable
{
    private readonly IMessageRecordRepository _messageRecordRepository;

    public AutoCleanMessage(IMessageRecordRepository messageRecordRepository)
    {
        _messageRecordRepository = messageRecordRepository;
    }

    public async Task Invoke()
    {
        double restDays = 10;
        await _messageRecordRepository.CleanMessageAsync(restDays);
    }
}