From dbcb27e41a97149c359c265a93bf8befb5e707b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A9=99=E5=AD=90?= <454313500@qq.com> Date: Sun, 23 Apr 2023 21:42:03 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E5=AE=8C=E6=88=90job=E5=AE=9A?= =?UTF-8?q?=E6=97=B6=E4=BB=BB=E5=8A=A1=E5=8A=9F=E8=83=BD=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Yi.Furion.Application/Rbac/Job/TestJob.cs | 24 ++++ .../Rbac/Services/Impl/TaskService.cs | 108 +++++++++++++++--- .../Yi.Furion.Application.xml | 49 ++++++++ .../Rbac/Dtos/Task/TaskCreateInput.cs | 32 ++++++ .../Rbac/Dtos/Task/TaskGetListInput.cs | 13 +++ .../Rbac/Dtos/Task/TaskGetListOutput.cs | 12 ++ .../Rbac/Dtos/Task/TaskGetOutput.cs | 12 ++ .../Rbac/Dtos/Task/TaskUpdateInput.cs | 30 +++++ .../Yi.Furion.Core/Rbac/Enums/JobTypeEnum.cs | 14 +++ Yi.Furion.Net6/Yi.Furion.Web.Core/Startup.cs | 4 +- 10 files changed, 280 insertions(+), 18 deletions(-) create mode 100644 Yi.Furion.Net6/Yi.Furion.Application/Rbac/Job/TestJob.cs create mode 100644 Yi.Furion.Net6/Yi.Furion.Core/Rbac/Dtos/Task/TaskCreateInput.cs create mode 100644 Yi.Furion.Net6/Yi.Furion.Core/Rbac/Dtos/Task/TaskGetListInput.cs create mode 100644 Yi.Furion.Net6/Yi.Furion.Core/Rbac/Dtos/Task/TaskGetListOutput.cs create mode 100644 Yi.Furion.Net6/Yi.Furion.Core/Rbac/Dtos/Task/TaskGetOutput.cs create mode 100644 Yi.Furion.Net6/Yi.Furion.Core/Rbac/Dtos/Task/TaskUpdateInput.cs create mode 100644 Yi.Furion.Net6/Yi.Furion.Core/Rbac/Enums/JobTypeEnum.cs diff --git a/Yi.Furion.Net6/Yi.Furion.Application/Rbac/Job/TestJob.cs b/Yi.Furion.Net6/Yi.Furion.Application/Rbac/Job/TestJob.cs new file mode 100644 index 00000000..7a5bdb54 --- /dev/null +++ b/Yi.Furion.Net6/Yi.Furion.Application/Rbac/Job/TestJob.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Furion.Schedule; + +namespace Yi.Furion.Application.Rbac.Job +{ + public class TestJob : IJob + { + public Task ExecuteAsync(JobExecutingContext context, CancellationToken stoppingToken) + { + ddd.ttt += 1; + Console.WriteLine($"你好,执行了{ddd.ttt}次"); + return Task.CompletedTask; + } + } + + public class ddd + { + public static int ttt = 0; + } +} diff --git a/Yi.Furion.Net6/Yi.Furion.Application/Rbac/Services/Impl/TaskService.cs b/Yi.Furion.Net6/Yi.Furion.Application/Rbac/Services/Impl/TaskService.cs index e20a600f..598efd2c 100644 --- a/Yi.Furion.Net6/Yi.Furion.Application/Rbac/Services/Impl/TaskService.cs +++ b/Yi.Furion.Net6/Yi.Furion.Application/Rbac/Services/Impl/TaskService.cs @@ -5,7 +5,10 @@ using System.Text; using System.Threading.Tasks; using Furion.Schedule; using Furion.TimeCrontab; +using Yi.Framework.Infrastructure.Ddd.Dtos; using Yi.Framework.Infrastructure.Ddd.Services; +using Yi.Furion.Application.Rbac.Job; +using Yi.Furion.Core.Rbac.Dtos.Task; namespace Yi.Furion.Application.Rbac.Services.Impl { @@ -16,28 +19,55 @@ namespace Yi.Furion.Application.Rbac.Services.Impl { _schedulerFactory = schedulerFactory; } - public object GetById(string jobId) + /// + /// 单查job + /// + /// + /// + public SchedulerModel GetById(string jobId) { var result = _schedulerFactory.TryGetJob(jobId, out var scheduler); return scheduler.GetModel(); } - public object Get() + + /// + /// 多询job + /// + /// + public PagedResultDto GetList([FromQuery]TaskGetListInput input) { - return _schedulerFactory.GetJobsOfModels(); + var data = _schedulerFactory.GetJobsOfModels().Skip(input.PageNum * input.PageSize).Take(input.PageSize).OrderByDescending(x => x.JobDetail.UpdatedTime).ToList(); + return new PagedResultDto(data.Count(), data); } - public object Create() + + /// + /// 创建job + /// + /// + /// + public ScheduleResult Create(TaskCreateInput input) { + + //jobBuilder - var jobBuilder = JobBuilder.Create("YourProject", "YourProject.MyJob"); + var jobBuilder = JobBuilder.Create(input.AssemblyName, input.JobTypeFullName).SetJobId(input.JobId).SetGroupName(input.GroupName); + //.SetConcurrent(input.Concurrent).SetDescription(input.Description).SetProperties(Newtonsoft.Json.JsonConvert.SerializeObject(input.Properties)); //triggerBuilder //毫秒 - var triggerBuilder = Triggers.Period(5000); - //cron - var triggerBuilder2 = Triggers.Cron("* * * * *", CronStringFormat.Default); + TriggerBuilder triggerBuilder = null; + switch (input.Type) + { + case Core.Rbac.Enums.JobTypeEnum.Cron: + triggerBuilder = Triggers.Cron(input.Cron, CronStringFormat.WithSeconds); + break; + case Core.Rbac.Enums.JobTypeEnum.Millisecond: + triggerBuilder = Triggers.Period(input.Millisecond); + break; + } //作业计划,单个jobBuilder与多个triggerBuilder组合 - var schedulerBuilder = SchedulerBuilder.Create(jobBuilder, triggerBuilder, triggerBuilder2); + var schedulerBuilder = SchedulerBuilder.Create(jobBuilder, triggerBuilder); //调度中心工厂,使用作业计划管理job,返回调度中心单个 @@ -45,24 +75,70 @@ namespace Yi.Furion.Application.Rbac.Services.Impl return result; } - public object Remove(string jobId) + + /// + /// 移除job + /// + /// + /// + public ScheduleResult Remove(string jobId) { var res = _schedulerFactory.TryRemoveJob(jobId, out var scheduler); return res; } - public object Update() + + /// + /// 暂停job + /// + /// + /// + public ScheduleResult Pause(string jobId) + { + var res = _schedulerFactory.TryGetJob(jobId, out var scheduler); + + scheduler.Pause(); + return res; + } + + /// + /// 开始job + /// + /// + /// + public ScheduleResult Start(string jobId) + { + var res = _schedulerFactory.TryGetJob(jobId, out var scheduler); + scheduler.Start(); + return res; + } + + /// + /// 更新job + /// + /// + /// + /// + public ScheduleResult Update(string jobId,TaskUpdateInput input) { //jobBuilder - var jobBuilder = JobBuilder.Create("YourProject", "YourProject.MyJob"); + var jobBuilder = JobBuilder.Create(input.AssemblyName, input.JobTypeFullName).SetJobId(jobId).SetGroupName(input.GroupName) + .SetConcurrent(input.Concurrent).SetDescription(input.Description).SetProperties(Newtonsoft.Json.JsonConvert.SerializeObject(input.Properties)); //triggerBuilder //毫秒 - var triggerBuilder = Triggers.Period(5000); - //cron - var triggerBuilder2 = Triggers.Cron("* * * * *", CronStringFormat.Default); + TriggerBuilder triggerBuilder = null; + switch (input.Type) + { + case Core.Rbac.Enums.JobTypeEnum.Cron: + triggerBuilder = Triggers.Cron(input.Cron, CronStringFormat.WithSeconds); + break; + case Core.Rbac.Enums.JobTypeEnum.Millisecond: + triggerBuilder = Triggers.Period(input.Millisecond); + break; + } //作业计划,单个jobBuilder与多个triggerBuilder组合 - var schedulerBuilder = SchedulerBuilder.Create(jobBuilder, triggerBuilder, triggerBuilder2); + var schedulerBuilder = SchedulerBuilder.Create(jobBuilder, triggerBuilder); var result = _schedulerFactory.TryUpdateJob(schedulerBuilder, out var scheduler); diff --git a/Yi.Furion.Net6/Yi.Furion.Application/Yi.Furion.Application.xml b/Yi.Furion.Net6/Yi.Furion.Application/Yi.Furion.Application.xml index 1fb18bfe..a20dc0c4 100644 --- a/Yi.Furion.Net6/Yi.Furion.Application/Yi.Furion.Application.xml +++ b/Yi.Furion.Net6/Yi.Furion.Application/Yi.Furion.Application.xml @@ -451,6 +451,55 @@ + + + 单查job + + + + + + + 多询job + + + + + + 创建job + + + + + + + 移除job + + + + + + + 暂停job + + + + + + + 开始job + + + + + + + 更新job + + + + + User服务实现 diff --git a/Yi.Furion.Net6/Yi.Furion.Core/Rbac/Dtos/Task/TaskCreateInput.cs b/Yi.Furion.Net6/Yi.Furion.Core/Rbac/Dtos/Task/TaskCreateInput.cs new file mode 100644 index 00000000..161e2b7d --- /dev/null +++ b/Yi.Furion.Net6/Yi.Furion.Core/Rbac/Dtos/Task/TaskCreateInput.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Yi.Furion.Core.Rbac.Enums; + +namespace Yi.Furion.Core.Rbac.Dtos.Task +{ + public class TaskCreateInput + { + public string AssemblyName { get; set; } + + public string JobTypeFullName { get; set; } + + public string JobId { get; set; } + + public string GroupName { get; set; } + + public JobTypeEnum Type { get; set; } + + public string Cron { get; set; } + + public int Millisecond { get; set; } + + public bool Concurrent { get; set; } + + public Dictionary Properties { get; set; } + + public string Description { get; set; } + } +} diff --git a/Yi.Furion.Net6/Yi.Furion.Core/Rbac/Dtos/Task/TaskGetListInput.cs b/Yi.Furion.Net6/Yi.Furion.Core/Rbac/Dtos/Task/TaskGetListInput.cs new file mode 100644 index 00000000..1b75aa04 --- /dev/null +++ b/Yi.Furion.Net6/Yi.Furion.Core/Rbac/Dtos/Task/TaskGetListInput.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Yi.Framework.Infrastructure.Ddd.Dtos; + +namespace Yi.Furion.Core.Rbac.Dtos.Task +{ + public class TaskGetListInput: PagedAllResultRequestDto + { + } +} diff --git a/Yi.Furion.Net6/Yi.Furion.Core/Rbac/Dtos/Task/TaskGetListOutput.cs b/Yi.Furion.Net6/Yi.Furion.Core/Rbac/Dtos/Task/TaskGetListOutput.cs new file mode 100644 index 00000000..1db63ace --- /dev/null +++ b/Yi.Furion.Net6/Yi.Furion.Core/Rbac/Dtos/Task/TaskGetListOutput.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Yi.Furion.Core.Rbac.Dtos.Task +{ + public class TaskGetListOutput + { + } +} diff --git a/Yi.Furion.Net6/Yi.Furion.Core/Rbac/Dtos/Task/TaskGetOutput.cs b/Yi.Furion.Net6/Yi.Furion.Core/Rbac/Dtos/Task/TaskGetOutput.cs new file mode 100644 index 00000000..0f61c000 --- /dev/null +++ b/Yi.Furion.Net6/Yi.Furion.Core/Rbac/Dtos/Task/TaskGetOutput.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Yi.Furion.Core.Rbac.Dtos.Task +{ + public class TaskGetOutput + { + } +} diff --git a/Yi.Furion.Net6/Yi.Furion.Core/Rbac/Dtos/Task/TaskUpdateInput.cs b/Yi.Furion.Net6/Yi.Furion.Core/Rbac/Dtos/Task/TaskUpdateInput.cs new file mode 100644 index 00000000..9b0fa4e2 --- /dev/null +++ b/Yi.Furion.Net6/Yi.Furion.Core/Rbac/Dtos/Task/TaskUpdateInput.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Yi.Furion.Core.Rbac.Enums; + +namespace Yi.Furion.Core.Rbac.Dtos.Task +{ + public class TaskUpdateInput + { + public string AssemblyName { get; set; } + + public string JobTypeFullName { get; set; } + + public string GroupName { get; set; } + + public JobTypeEnum Type { get; set; } + + public string Cron { get; set; } + + public int Millisecond { get; set; } + + public bool Concurrent { get; set; } + + public Dictionary Properties { get; set; } + + public string Description { get; set; } + } +} diff --git a/Yi.Furion.Net6/Yi.Furion.Core/Rbac/Enums/JobTypeEnum.cs b/Yi.Furion.Net6/Yi.Furion.Core/Rbac/Enums/JobTypeEnum.cs new file mode 100644 index 00000000..b367f8e4 --- /dev/null +++ b/Yi.Furion.Net6/Yi.Furion.Core/Rbac/Enums/JobTypeEnum.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Yi.Furion.Core.Rbac.Enums +{ + public enum JobTypeEnum + { + Cron, + Millisecond + } +} diff --git a/Yi.Furion.Net6/Yi.Furion.Web.Core/Startup.cs b/Yi.Furion.Net6/Yi.Furion.Web.Core/Startup.cs index 717b4d82..118a4618 100644 --- a/Yi.Furion.Net6/Yi.Furion.Web.Core/Startup.cs +++ b/Yi.Furion.Net6/Yi.Furion.Web.Core/Startup.cs @@ -36,8 +36,8 @@ public class Startup : AppStartup services.AddSchedule(options => { // 注册作业,并配置作业触发器 - options.AddJob(Triggers.Period(10000)); // 表示每秒执行 - // options.AddJob(Triggers.Cron("0 0 0,12 ? * ?",CronStringFormat.WithSeconds)); // 表示每秒执行 + //options.AddJob(Triggers.Period(10000)); // 表示每秒执行 + options.AddJob(Triggers.Cron("0 0 0,12 ? * ?",CronStringFormat.WithSeconds)); // 表示每天凌晨与12点 }); services.AddFileLogging("application-{0:yyyy}-{0:MM}-{0:dd}.log", options => {