using System; using System.Collections.Generic; using System.Linq; 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 { public class TaskService : ApplicationService, ITaskService, IDynamicApiController, ITransient { private readonly ISchedulerFactory _schedulerFactory; public TaskService(ISchedulerFactory schedulerFactory) { _schedulerFactory = schedulerFactory; } /// /// 单查job /// /// /// [HttpGet("{jobId}")] public SchedulerModel GetById([FromRoute] string jobId) { var result = _schedulerFactory.TryGetJob(jobId, out var scheduler); return scheduler.GetModel(); } /// /// 多查job /// /// [HttpGet("")] public PagedResultDto GetList([FromQuery] TaskGetListInput input) { var data = _schedulerFactory.GetJobsOfModels().Skip((input.PageNum - 1) * input.PageSize).Take(input.PageSize).OrderByDescending(x => x.JobDetail.UpdatedTime) .ToList(); var output = data.Select(x => x.JobDetail).Adapt>(); return new PagedResultDto(data.Count(), output); } /// /// 创建job /// /// /// public ScheduleResult Create(TaskCreateInput input) { //jobBuilder 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 //毫秒 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); //调度中心工厂,使用作业计划管理job,返回调度中心单个 var result = _schedulerFactory.TryAddJob(schedulerBuilder, out var scheduler); return result; } /// /// 移除job /// /// /// public ScheduleResult Remove(string jobId) { var res = _schedulerFactory.TryRemoveJob(jobId, out var scheduler); return res; } /// /// 暂停job /// /// /// [HttpPut] public ScheduleResult Pause(string jobId) { var res = _schedulerFactory.TryGetJob(jobId, out var scheduler); scheduler.Pause(); return res; } /// /// 开始job /// /// /// [HttpPut] 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(input.AssemblyName, input.JobTypeFullName).SetJobId(jobId).SetGroupName(input.GroupName) .SetConcurrent(input.Concurrent).SetDescription(input.Description).SetProperties(Newtonsoft.Json.JsonConvert.SerializeObject(input.Properties)); //triggerBuilder //毫秒 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); var result = _schedulerFactory.TryUpdateJob(schedulerBuilder, out var scheduler); return result; } } }