Пример #1
0
        /// <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();
		}
Пример #3
0
        /// <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();
        }