2023-04-22 19:13:29 +08:00
|
|
|
|
using System;
|
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
using System.Linq;
|
|
|
|
|
|
using System.Text;
|
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
|
using Furion.Schedule;
|
|
|
|
|
|
using Furion.TimeCrontab;
|
2023-04-23 21:42:03 +08:00
|
|
|
|
using Yi.Framework.Infrastructure.Ddd.Dtos;
|
2023-04-22 19:13:29 +08:00
|
|
|
|
using Yi.Framework.Infrastructure.Ddd.Services;
|
2023-04-23 21:42:03 +08:00
|
|
|
|
using Yi.Furion.Application.Rbac.Job;
|
|
|
|
|
|
using Yi.Furion.Core.Rbac.Dtos.Task;
|
2023-04-22 19:13:29 +08:00
|
|
|
|
|
|
|
|
|
|
namespace Yi.Furion.Application.Rbac.Services.Impl
|
|
|
|
|
|
{
|
|
|
|
|
|
public class TaskService : ApplicationService, ITaskService, IDynamicApiController, ITransient
|
|
|
|
|
|
{
|
|
|
|
|
|
private readonly ISchedulerFactory _schedulerFactory;
|
|
|
|
|
|
public TaskService(ISchedulerFactory schedulerFactory)
|
|
|
|
|
|
{
|
|
|
|
|
|
_schedulerFactory = schedulerFactory;
|
|
|
|
|
|
}
|
2023-04-23 21:42:03 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 单查job
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="jobId"></param>
|
|
|
|
|
|
/// <returns></returns>
|
2023-04-23 23:46:20 +08:00
|
|
|
|
[HttpGet("{jobId}")]
|
2023-04-25 10:38:51 +08:00
|
|
|
|
public TaskGetOutput GetById([FromRoute] string jobId)
|
2023-04-22 19:13:29 +08:00
|
|
|
|
{
|
|
|
|
|
|
var result = _schedulerFactory.TryGetJob(jobId, out var scheduler);
|
2023-04-25 10:38:51 +08:00
|
|
|
|
var data = scheduler.GetModel();
|
|
|
|
|
|
var output = data.JobDetail.Adapt<TaskGetOutput>();
|
2023-04-25 13:30:54 +08:00
|
|
|
|
output.TriggerArgs = data.Triggers[0].Args;
|
|
|
|
|
|
output.NextRunTime = data.Triggers[0].NextRunTime;
|
|
|
|
|
|
output.LastRunTime = data.Triggers[0].LastRunTime;
|
|
|
|
|
|
output.NumberOfRuns = data.Triggers[0].NumberOfRuns;
|
2023-04-25 10:38:51 +08:00
|
|
|
|
return output;
|
2023-04-22 19:13:29 +08:00
|
|
|
|
}
|
2023-04-23 21:42:03 +08:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2023-04-23 23:46:20 +08:00
|
|
|
|
/// 多查job
|
2023-04-23 21:42:03 +08:00
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <returns></returns>
|
2023-04-23 23:46:20 +08:00
|
|
|
|
[HttpGet("")]
|
2023-04-25 09:19:17 +08:00
|
|
|
|
public PagedResultDto<TaskGetListOutput> GetList([FromQuery] TaskGetListInput input)
|
2023-04-22 19:13:29 +08:00
|
|
|
|
{
|
2023-04-25 09:19:17 +08:00
|
|
|
|
var data = _schedulerFactory.GetJobsOfModels().Skip((input.PageNum - 1) * input.PageSize).Take(input.PageSize).OrderByDescending(x => x.JobDetail.UpdatedTime)
|
|
|
|
|
|
|
|
|
|
|
|
.ToList();
|
2023-04-25 13:30:54 +08:00
|
|
|
|
var output = data.Select(x => {
|
|
|
|
|
|
|
|
|
|
|
|
var res= new TaskGetListOutput();
|
|
|
|
|
|
res= x.JobDetail.Adapt<TaskGetListOutput>();
|
|
|
|
|
|
res.TriggerArgs = x.Triggers[0].Args;
|
|
|
|
|
|
res.Status = x.Triggers[0].Status.ToString();
|
|
|
|
|
|
return res;
|
|
|
|
|
|
} ).ToList();
|
2023-04-25 09:19:17 +08:00
|
|
|
|
return new PagedResultDto<TaskGetListOutput>(data.Count(), output);
|
2023-04-22 19:13:29 +08:00
|
|
|
|
}
|
2023-04-23 21:42:03 +08:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 创建job
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="input"></param>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
public ScheduleResult Create(TaskCreateInput input)
|
2023-04-22 19:13:29 +08:00
|
|
|
|
{
|
2023-04-23 21:42:03 +08:00
|
|
|
|
|
|
|
|
|
|
|
2023-04-22 19:13:29 +08:00
|
|
|
|
//jobBuilder
|
2023-04-25 13:30:54 +08:00
|
|
|
|
var jobBuilder = JobBuilder.Create(input.AssemblyName, input.JobType).SetJobId(input.JobId).SetGroupName(input.GroupName)
|
|
|
|
|
|
.SetConcurrent(input.Concurrent).SetDescription(input.Description);
|
2023-04-22 19:13:29 +08:00
|
|
|
|
|
|
|
|
|
|
//triggerBuilder
|
|
|
|
|
|
//毫秒
|
2023-04-23 21:42:03 +08:00
|
|
|
|
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;
|
|
|
|
|
|
}
|
2023-04-22 19:13:29 +08:00
|
|
|
|
|
|
|
|
|
|
//作业计划,单个jobBuilder与多个triggerBuilder组合
|
2023-04-23 21:42:03 +08:00
|
|
|
|
var schedulerBuilder = SchedulerBuilder.Create(jobBuilder, triggerBuilder);
|
2023-04-22 19:13:29 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//调度中心工厂,使用作业计划管理job,返回调度中心单个
|
|
|
|
|
|
var result = _schedulerFactory.TryAddJob(schedulerBuilder, out var scheduler);
|
|
|
|
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
|
}
|
2023-04-23 21:42:03 +08:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 移除job
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="jobId"></param>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
public ScheduleResult Remove(string jobId)
|
2023-04-22 19:13:29 +08:00
|
|
|
|
{
|
|
|
|
|
|
var res = _schedulerFactory.TryRemoveJob(jobId, out var scheduler);
|
|
|
|
|
|
return res;
|
|
|
|
|
|
}
|
2023-04-23 21:42:03 +08:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 暂停job
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="jobId"></param>
|
|
|
|
|
|
/// <returns></returns>
|
2023-04-23 23:46:20 +08:00
|
|
|
|
[HttpPut]
|
2023-04-23 21:42:03 +08:00
|
|
|
|
public ScheduleResult Pause(string jobId)
|
|
|
|
|
|
{
|
|
|
|
|
|
var res = _schedulerFactory.TryGetJob(jobId, out var scheduler);
|
|
|
|
|
|
|
|
|
|
|
|
scheduler.Pause();
|
|
|
|
|
|
return res;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 开始job
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="jobId"></param>
|
|
|
|
|
|
/// <returns></returns>
|
2023-04-23 23:46:20 +08:00
|
|
|
|
[HttpPut]
|
2023-04-23 21:42:03 +08:00
|
|
|
|
public ScheduleResult Start(string jobId)
|
|
|
|
|
|
{
|
|
|
|
|
|
var res = _schedulerFactory.TryGetJob(jobId, out var scheduler);
|
|
|
|
|
|
scheduler.Start();
|
|
|
|
|
|
return res;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 更新job
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="jobId"></param>
|
|
|
|
|
|
/// <param name="input"></param>
|
|
|
|
|
|
/// <returns></returns>
|
2023-04-25 09:19:17 +08:00
|
|
|
|
public ScheduleResult Update(string jobId, TaskUpdateInput input)
|
2023-04-22 19:13:29 +08:00
|
|
|
|
{
|
|
|
|
|
|
//jobBuilder
|
2023-04-25 13:30:54 +08:00
|
|
|
|
var jobBuilder = JobBuilder.Create(input.AssemblyName, input.JobType).SetJobId(jobId).SetGroupName(input.GroupName)
|
|
|
|
|
|
.SetConcurrent(input.Concurrent).SetDescription(input.Description);
|
2023-04-22 19:13:29 +08:00
|
|
|
|
|
|
|
|
|
|
//triggerBuilder
|
|
|
|
|
|
//毫秒
|
2023-04-23 21:42:03 +08:00
|
|
|
|
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;
|
|
|
|
|
|
}
|
2023-04-22 19:13:29 +08:00
|
|
|
|
|
|
|
|
|
|
//作业计划,单个jobBuilder与多个triggerBuilder组合
|
2023-04-23 21:42:03 +08:00
|
|
|
|
var schedulerBuilder = SchedulerBuilder.Create(jobBuilder, triggerBuilder);
|
2023-04-22 19:13:29 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var result = _schedulerFactory.TryUpdateJob(schedulerBuilder, out var scheduler);
|
|
|
|
|
|
return result;
|
|
|
|
|
|
}
|
2023-04-24 21:08:12 +08:00
|
|
|
|
|
|
|
|
|
|
[HttpPost]
|
|
|
|
|
|
public bool RunOnce(string jobId)
|
|
|
|
|
|
{
|
|
|
|
|
|
var result = _schedulerFactory.TryGetJob(jobId, out var scheduler);
|
|
|
|
|
|
|
|
|
|
|
|
var triggerBuilder = Triggers.Period(100).SetRunOnStart(true).SetMaxNumberOfRuns(1);
|
|
|
|
|
|
scheduler.AddTrigger(triggerBuilder);
|
|
|
|
|
|
//设置启动时执行一次,然后最大只执行一次
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
2023-04-22 19:13:29 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|