/// <summary> /// 处理单个定时任务 /// </summary> /// <param name="executor">定时任务执行器</param> public void HandleTask(IScheduledTaskExecutor executor) { var databaseManager = Application.Ioc.Resolve <DatabaseManager>(); using (var context = databaseManager.CreateContext()) { // 从数据库获取任务的最后执行时间,判断是否需要立刻执行 context.BeginTransaction(); var task = context.Get <ScheduledTask>(t => t.Key == executor.Key); if (!executor.ShouldExecuteNow(task != null ? task.LastExecuted : DateTime.MinValue)) { return; } // 执行前使用事务更新数据库中的LastExecuted,防止多个进程托管同一个网站时重复执行 // 如果重复执行Save应该会抛出例外(实际捕捉到例外后再添加catch处理) if (task == null) { task = new ScheduledTask() { Key = executor.Key, CreateTime = DateTime.UtcNow }; } context.Save(ref task, t => t.LastExecuted = DateTime.UtcNow); context.FinishTransaction(); } // 执行定时任务 executor.Execute(); }
/// <summary> /// 处理单个定时任务 /// </summary> /// <param name="executor">定时任务执行器</param> public void HandleTask(IScheduledTaskExecutor executor) { var databaseManager = Application.Ioc.Resolve<DatabaseManager>(); using (var context = databaseManager.GetContext()) { // 从数据库获取任务的最后执行时间,判断是否需要立刻执行 var task = context.Get<ScheduledTask>(t => t.Key == executor.Key); if (!executor.ShouldExecuteNow(task != null ? task.LastExecuted : DateTime.MinValue)) { return; } // 执行前使用事务更新数据库中的LastExecuted,防止多个进程托管同一个网站时重复执行 // 如果重复执行Save应该会抛出例外(实际捕捉到例外后再添加catch处理) if (task == null) { task = new ScheduledTask() { Key = executor.Key, CreateTime = DateTime.UtcNow }; } context.Save(ref task, t => t.LastExecuted = DateTime.UtcNow); context.SaveChanges(); } // 执行定时任务 executor.Execute(); }
/// <summary> /// 处理单个定时任务 /// </summary> /// <param name="executor">定时任务执行器</param> protected virtual void HandleTask(IScheduledTaskExecutor executor) { var uow = UnitOfWork; using (uow.Scope()) { // 从数据库获取任务的最后执行时间,判断是否需要立刻执行 uow.Context.BeginTransaction(); var task = Get(executor.Key); var lastExecuted = task != null ? task.UpdateTime : DateTime.MinValue; if (!executor.ShouldExecuteNow(lastExecuted)) { return; } // 执行前使用事务更新数据库中的执行时间,防止多个进程托管同一个网站时重复执行 task = task ?? new ScheduledTask() { Id = executor.Key }; Save(ref task, t => t.UpdateTime = DateTime.UtcNow); uow.Context.FinishTransaction(); } // 执行定时任务 executor.Execute(); }