DAL层:
删除定时任务时:
var sql = $@"select * from 表名 where Id in @ids";
var list = db.Connection.Query<Model.TaskJob.TaskJob>(sql, new { ids = ids }).ToList();
foreach (var item in list)
{
// 停止触发器
scheduler.PauseTrigger(new TriggerKey(item.Id, item.TaskName));
// 移除触发器
scheduler.UnscheduleJob(new TriggerKey(item.Id, item.TaskName));
//删除任务
scheduler.DeleteJob(new JobKey(item.Id, item.TaskName));
}
新增定时任务:直接调用StartTask(taskJob);方法
编辑定时任务、立即执行定时任务:
var sql = $@"select * from 表名 where Id=@id";
var param = db.Connection.QueryFirstOrDefault<Model.TaskJob.TaskJob>(sql, new { id = task.Id });
// 停止触发器
scheduler.PauseTrigger(new TriggerKey(param.Id, param.TaskName));
// 移除触发器
scheduler.UnscheduleJob(new TriggerKey(param.Id, param.TaskName));
//删除任务
scheduler.DeleteJob(new JobKey(param.Id, param.TaskName));
StartTask(taskJob);
StartTask方法:
public void StartTask(Model.TaskJob.TaskJob task)
{
using (var db = CreateWriteDatabase())
{
var triggerKey = new TriggerKey(task.Id, task.TaskName);
var jobKey = new JobKey(task.Id, task.TaskName);
var job = JobBuilder.Create<TaskJob>()
.WithIdentity(jobKey)
.UsingJobData("Url", task.Url)
.UsingJobData("UrlBody", string.IsNullOrEmpty(task.UrlBody) ? "" : task.UrlBody)
.UsingJobData("TenantCode", CompanyId)
.Build();
if (task.IsRun == "Y")
{
if (!scheduler.IsStarted)
{
scheduler.Start();
}
var trigger = TriggerBuilder.Create()
.WithIdentity(triggerKey)
.StartAt(DateBuilder.NextGivenSecondDate(DateTime.Now, 1))
.WithCronSchedule(task.Cron)
.Build();
scheduler.ScheduleJob(job, trigger);
//判断是否立刻执行任务
if (task.WithImmediateEffect == "Y")
{
scheduler.TriggerJob(jobKey);
}
}
}
}
暂停、开启定时任务:
var sql = $@"select * from表名 where Id=@id";
var taskJob = db.Connection.QueryFirstOrDefault<Model.TaskJob.TaskJob>(sql, new { id = task.Id });
if (taskJob != null)
{
if (!scheduler.IsStarted)
{
scheduler.Start();
}
//暂停
if (task.IsRun == "N")
{
scheduler.PauseJob(new JobKey(taskJob.Id, taskJob.TaskName));
}
//开启
else
{
scheduler.ResumeJob(new JobKey(taskJob.Id, taskJob.TaskName));
}
}
调用这些方法前添加:static IScheduler scheduler = TaskJobBase.Scheduler;
service:(下面也是重点,定义调度开启)
public class TaskJobBase
{
private static IScheduler _scheduler;
public static IScheduler Scheduler
{
get
{
if (_scheduler != null)
{
return _scheduler;
}
var schedulerFactory = new StdSchedulerFactory();
_scheduler = schedulerFactory.GetScheduler();
if (!_scheduler.IsStarted)
{
_scheduler.Start();
}
return _scheduler;
}
}
}
//具体实现,调度具体内容实现
public class TaskJob : IJob
{
private static ILogger logger = LoggerManager.GetLogger();
public void Execute(IJobExecutionContext context)
{
var start = DateTime.Now;
var dataMap = context.JobDetail.JobDataMap;
JobKey key = context.JobDetail.Key;
try
{
var id = key.Name;
var url = dataMap.GetString("Url");
var model = new Model.TaskJob.TaskJobModel();
model.Parameter = dataMap.GetString("UrlBody");
model.TenantCode = dataMap.GetString("TenantCode");
logger.Info($@"【{key.Name}】-【{key.Group}】:任务调度执行开始");
HttpClientHelper httpClient = new HttpClientHelper();
httpClient.PostData(url, model);
var sql = $@"update 表名 set Status='1',latestTime=now() where Id=@id";
BaseDAL.CreateWriteDatabase().Connection.Execute(sql, new { id = id });
var end = DateTime.Now;
var diff = end - start;
logger.Info($@"【{key.Name}】-【{key.Group}】:任务调度执行结束,当前耗时:{diff}");
}
catch (Exception ex)
{
logger.Info($@"【{key.Name}】-【{key.Group}】:任务调度报错" + ex.Message);
}
}
}