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 => {