feat:完成job定时任务功能模块

This commit is contained in:
橙子
2023-04-23 21:42:03 +08:00
parent 4b5b4464f4
commit dbcb27e41a
10 changed files with 280 additions and 18 deletions

View File

@@ -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;
}
}

View File

@@ -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)
/// <summary>
/// 单查job
/// </summary>
/// <param name="jobId"></param>
/// <returns></returns>
public SchedulerModel GetById(string jobId)
{
var result = _schedulerFactory.TryGetJob(jobId, out var scheduler);
return scheduler.GetModel();
}
public object Get()
/// <summary>
/// 多询job
/// </summary>
/// <returns></returns>
public PagedResultDto<SchedulerModel> 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<SchedulerModel>(data.Count(), data);
}
public object Create()
/// <summary>
/// 创建job
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
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)
/// <summary>
/// 移除job
/// </summary>
/// <param name="jobId"></param>
/// <returns></returns>
public ScheduleResult Remove(string jobId)
{
var res = _schedulerFactory.TryRemoveJob(jobId, out var scheduler);
return res;
}
public object Update()
/// <summary>
/// 暂停job
/// </summary>
/// <param name="jobId"></param>
/// <returns></returns>
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>
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>
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);

View File

@@ -451,6 +451,55 @@
<param name="state"></param>
<returns></returns>
</member>
<member name="M:Yi.Furion.Application.Rbac.Services.Impl.TaskService.GetById(System.String)">
<summary>
单查job
</summary>
<param name="jobId"></param>
<returns></returns>
</member>
<member name="M:Yi.Furion.Application.Rbac.Services.Impl.TaskService.GetList(Yi.Furion.Core.Rbac.Dtos.Task.TaskGetListInput)">
<summary>
多询job
</summary>
<returns></returns>
</member>
<member name="M:Yi.Furion.Application.Rbac.Services.Impl.TaskService.Create(Yi.Furion.Core.Rbac.Dtos.Task.TaskCreateInput)">
<summary>
创建job
</summary>
<param name="input"></param>
<returns></returns>
</member>
<member name="M:Yi.Furion.Application.Rbac.Services.Impl.TaskService.Remove(System.String)">
<summary>
移除job
</summary>
<param name="jobId"></param>
<returns></returns>
</member>
<member name="M:Yi.Furion.Application.Rbac.Services.Impl.TaskService.Pause(System.String)">
<summary>
暂停job
</summary>
<param name="jobId"></param>
<returns></returns>
</member>
<member name="M:Yi.Furion.Application.Rbac.Services.Impl.TaskService.Start(System.String)">
<summary>
开始job
</summary>
<param name="jobId"></param>
<returns></returns>
</member>
<member name="M:Yi.Furion.Application.Rbac.Services.Impl.TaskService.Update(System.String,Yi.Furion.Core.Rbac.Dtos.Task.TaskUpdateInput)">
<summary>
更新job
</summary>
<param name="jobId"></param>
<param name="input"></param>
<returns></returns>
</member>
<member name="T:Yi.Furion.Application.Rbac.Services.Impl.UserService">
<summary>
User服务实现

View File

@@ -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<string, object> Properties { get; set; }
public string Description { get; set; }
}
}

View File

@@ -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
{
}
}

View File

@@ -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
{
}
}

View File

@@ -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
{
}
}

View File

@@ -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<string, object> Properties { get; set; }
public string Description { get; set; }
}
}

View File

@@ -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
}
}

View File

@@ -36,8 +36,8 @@ public class Startup : AppStartup
services.AddSchedule(options =>
{
// 注册作业,并配置作业触发器
options.AddJob<SystemDataJob>(Triggers.Period(10000)); // 表示每秒执行
// options.AddJob<SystemDataJob>(Triggers.Cron("0 0 0,12 ? * ?",CronStringFormat.WithSeconds)); // 表示每秒执行
//options.AddJob<SystemDataJob>(Triggers.Period(10000)); // 表示每秒执行
options.AddJob<SystemDataJob>(Triggers.Cron("0 0 0,12 ? * ?",CronStringFormat.WithSeconds)); // 表示每天凌晨与12点
});
services.AddFileLogging("application-{0:yyyy}-{0:MM}-{0:dd}.log", options =>
{