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
///
///
///
public SchedulerModel GetById(string jobId)
{
var result = _schedulerFactory.TryGetJob(jobId, out var scheduler);
return scheduler.GetModel();
}
///
/// 多询job
///
///
public PagedResultDto GetList([FromQuery]TaskGetListInput input)
{
var data = _schedulerFactory.GetJobsOfModels().Skip(input.PageNum * input.PageSize).Take(input.PageSize).OrderByDescending(x => x.JobDetail.UpdatedTime).ToList();
return new PagedResultDto(data.Count(), data);
}
///
/// 创建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
///
///
///
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(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;
}
}
}