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);
}
}