| | |
| | | /// <summary> |
| | | /// |
| | | /// </summary> |
| | | public class InterfaceServiceNew: IInterfaceService |
| | | public class InterfaceServiceNew : IInterfaceService |
| | | { |
| | | #region Sundial计划调度 旧版本使用 |
| | | |
| | |
| | | public ApiAction AddJob<TJob>(TJob newEntity, TskJobParam jobParam) where TJob : class, Sundial.IJob |
| | | { |
| | | ApiAction apiAction = new(); |
| | | Sundial.TriggerBuilder triggerBuilder = Sundial.Triggers.Period(jobParam.Period*60*1000).LoadFrom(new |
| | | Sundial.TriggerBuilder triggerBuilder = Sundial.Triggers.Period(jobParam.Period * 60 * 1000).LoadFrom(new |
| | | { |
| | | TriggerId = jobParam.JobName + "_trigger1", |
| | | }); |
| | |
| | | { |
| | | try |
| | | { |
| | | var jobs = Biz.Db.Queryable<TSK_JOB>().IncludesAllFirstLayer().ToList(); |
| | | foreach (var job in jobs) |
| | | { |
| | | Type type = Type.GetType($"{job.AssemblyName}.{job.JobType},{job.AssemblyName}", throwOnError: true); |
| | | _schedulerFactory.AddJob(type, job.JobName, Sundial.Triggers.Period(Convert.ToInt32(job.Triggers?[0].Args ?? "3") * 60 * 1000)); |
| | | if (job.Triggers[0]?.Status == 3) |
| | | { |
| | | Work.DoAsync(() => |
| | | { |
| | | Thread.Sleep(2000); |
| | | PauseJob(job.JobName); |
| | | }); |
| | | } |
| | | } |
| | | var jobs = Biz.Db.Queryable<TSK_JOB>().IncludesAllFirstLayer().ToList(); |
| | | foreach (var job in jobs) |
| | | { |
| | | Type type = Type.GetType($"{job.AssemblyName}.{job.JobType},{job.AssemblyName}", throwOnError: true); |
| | | _schedulerFactory.AddJob(type, job.JobName, Sundial.Triggers.Period(Convert.ToInt32(job.Triggers?[0].Args ?? "3") * 60 * 1000)); |
| | | if (job.Triggers[0]?.Status == 3) |
| | | { |
| | | Work.DoAsync(() => |
| | | { |
| | | Thread.Sleep(2000); |
| | | PauseJob(job.JobName); |
| | | }); |
| | | } |
| | | } |
| | | } |
| | | catch (System.Exception ex) |
| | | { |
| | |
| | | /// </summary> |
| | | public void JobInitialize() |
| | | { |
| | | JobManager.Initialize(); |
| | | JobManager.Initialize(AddJobsFromDB()); |
| | | JobManager.JobException += info => Logger.Scheduler.Error("An error just happened with a scheduled job: " + info.Exception); |
| | | JobManager.JobStart += info => Logger.Scheduler.Info($"{info.Name}: started"); |
| | | JobManager.JobEnd += info => Logger.Scheduler.Info($"{info.Name}: ended ({info.Duration})"); |
| | | JobManager.JobStart += info => Logger.Scheduler.Info($"{info.Name}: started\r\n"); |
| | | JobManager.JobEnd += info => Logger.Scheduler.Info($"{info.Name}: ended ({info.Duration})\r\n"); |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | ApiAction apiAction = new(); |
| | | try |
| | | { |
| | | JobManager.AddJob<TJob>((s) => s.ToRunEvery(5).Seconds()); |
| | | JobManager.AddJob<TJob>((s) => GenerateSchedule(jobParam.Args, s.WithName(jobParam.JobName))); |
| | | |
| | | //Sundial.TriggerBuilder triggerBuilder = Sundial.Triggers.Period(jobParam.Period * 60 * 1000).LoadFrom(new |
| | | //{ |
| | | // TriggerId = jobParam.JobName + "_trigger1", |
| | |
| | | /// <summary> |
| | | /// 从数据库批量添加任务 |
| | | /// </summary> |
| | | public void AddJobsFromDB() |
| | | public Registry AddJobsFromDB() |
| | | { |
| | | // 声明一个Registry类 |
| | | var registry = new Registry(); |
| | | try |
| | | { |
| | | var jobs = Biz.Db.Queryable<TSK_JOB>().IncludesAllFirstLayer().ToList(); |
| | | // 声明一个Registry类 |
| | | var registry = new Registry(); |
| | | foreach (var job in jobs) |
| | | { |
| | | Type type = Type.GetType($"{job.AssemblyName}.{job.JobType},{job.AssemblyName}", throwOnError: true); |
| | | dynamic _type = Activator.CreateInstance(type); |
| | | TrigArgs args = JsonConvert.DeserializeObject<TrigArgs>(job.Triggers[0].Args); |
| | | Schedule schedule = Schedule(_type,job.JobName, registry); |
| | | SpecificTimeUnit specificTimeUnit = null; |
| | | TimeUnit timeUnit = null; |
| | | if (args.NonReentrant == "Y") { schedule = schedule.NonReentrant(); } |
| | | if (args.ToRunNow == "Y") { specificTimeUnit = schedule.ToRunNow(); } |
| | | if (args.ToRunOnceIn > 0) { timeUnit = schedule.ToRunOnceIn(args.ToRunOnceIn); } |
| | | else if (args.ToRunEvery >= 0) { timeUnit = schedule.ToRunEvery(args.ToRunEvery); } |
| | | //按时间类型来运行 |
| | | switch (args.Type) |
| | | { |
| | | case TrigArgs.EveryType.Milliseconds: |
| | | timeUnit.Milliseconds(); |
| | | break; |
| | | case TrigArgs.EveryType.Seconds: |
| | | timeUnit.Seconds(); |
| | | break; |
| | | case TrigArgs.EveryType.Minutes: |
| | | timeUnit.Minutes(); |
| | | break; |
| | | case TrigArgs.EveryType.Hours: |
| | | if (args.Minutes > 0) |
| | | { |
| | | timeUnit.Hours().At(args.Minutes); |
| | | } |
| | | else |
| | | { |
| | | timeUnit.Hours(); |
| | | } |
| | | break; |
| | | case TrigArgs.EveryType.Days: |
| | | if (args.Hours>0 && args.Minutes > 0 ) |
| | | { |
| | | timeUnit.Days().At(args.Hours, args.Minutes); |
| | | } |
| | | else |
| | | { |
| | | timeUnit.Days(); |
| | | } |
| | | break; |
| | | case TrigArgs.EveryType.Weeks: |
| | | if (args.Hours > 0 && args.Minutes > 0) |
| | | { |
| | | timeUnit.Weeks().At(args.Hours, args.Minutes); |
| | | } |
| | | else |
| | | { |
| | | timeUnit.Weeks(); |
| | | } |
| | | break; |
| | | case TrigArgs.EveryType.Weekdays: |
| | | if (args.Hours > 0 && args.Minutes > 0) |
| | | { |
| | | timeUnit.Weekdays().At(args.Hours, args.Minutes); |
| | | } |
| | | else |
| | | { |
| | | timeUnit.Weekdays(); |
| | | } |
| | | break; |
| | | } |
| | | |
| | | Schedule schedule = Schedule(_type, job.JobName, registry); |
| | | //生成计划 |
| | | GenerateSchedule(args, schedule); |
| | | } |
| | | } |
| | | catch (System.Exception ex) |
| | | { |
| | | Logger.Console.Fatal(ex, "Add Job From DB Exception"); |
| | | } |
| | | return registry; |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 生成计划 |
| | | /// </summary> |
| | | /// <param name="args"></param> |
| | | /// <param name="schedule"></param> |
| | | private void GenerateSchedule(TrigArgs args, Schedule schedule) |
| | | { |
| | | SpecificTimeUnit specificTimeUnit = null; |
| | | TimeUnit timeUnit = null; |
| | | if (args.NonReentrant == "Y") { schedule = schedule.NonReentrant(); } |
| | | if (args.ToRunNow == "Y") { specificTimeUnit = schedule.ToRunNow(); } |
| | | if (args.ToRunOnceAt == "Y") { specificTimeUnit = schedule.ToRunOnceAt(args.ToRunOnceAtDt.AddMinutes(args.NowAddMinutes)); } |
| | | if (args.ToRunOnceIn > 0) { timeUnit = schedule.ToRunOnceIn(args.ToRunOnceIn); } |
| | | else if (args.ToRunEvery >= 0) { timeUnit = schedule.ToRunEvery(args.ToRunEvery); } |
| | | if (specificTimeUnit != null && args.AndEvery>0) { timeUnit = specificTimeUnit.AndEvery(args.AndEvery); } |
| | | //按时间类型来运行 |
| | | switch (args.Type) |
| | | { |
| | | case TrigArgs.EveryType.Milliseconds: |
| | | timeUnit.Milliseconds(); |
| | | break; |
| | | case TrigArgs.EveryType.Seconds: |
| | | timeUnit.Seconds(); |
| | | break; |
| | | case TrigArgs.EveryType.Minutes: |
| | | timeUnit.Minutes(); |
| | | break; |
| | | case TrigArgs.EveryType.Hours: |
| | | if (args.Minutes > 0) |
| | | { |
| | | timeUnit.Hours().At(args.Minutes); |
| | | } |
| | | else |
| | | { |
| | | timeUnit.Hours(); |
| | | } |
| | | break; |
| | | case TrigArgs.EveryType.Days: |
| | | if (args.Hours > 0 && args.Minutes > 0) |
| | | { |
| | | timeUnit.Days().At(args.Hours, args.Minutes); |
| | | } |
| | | else |
| | | { |
| | | timeUnit.Days(); |
| | | } |
| | | break; |
| | | case TrigArgs.EveryType.Weeks: |
| | | if (args.Hours > 0 && args.Minutes > 0) |
| | | { |
| | | timeUnit.Weeks().At(args.Hours, args.Minutes); |
| | | } |
| | | else |
| | | { |
| | | timeUnit.Weeks(); |
| | | } |
| | | break; |
| | | case TrigArgs.EveryType.Weekdays: |
| | | if (args.Hours > 0 && args.Minutes > 0) |
| | | { |
| | | timeUnit.Weekdays().At(args.Hours, args.Minutes); |
| | | } |
| | | else |
| | | { |
| | | timeUnit.Weekdays(); |
| | | } |
| | | break; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 停止服务 |
| | | /// </summary> |
| | | public void Stop() |
| | |
| | | /// <summary> |
| | | /// 在任务完成后等待或者停止 |
| | | /// </summary> |
| | | public void StopAndBlock() { |
| | | public void StopAndBlock() |
| | | { |
| | | JobManager.StopAndBlock(); |
| | | } |
| | | |