first commit

This commit is contained in:
2026-09-02 16:31:50 +08:00
commit a461727193
911 changed files with 692450 additions and 0 deletions
+95
View File
@@ -0,0 +1,95 @@
using JSMachine.WMS.Common;
using JSMachine.WMS.Infrastructure.Enums;
using JSMachine.WMS.Job.Enum;
using JSMachine.WMS.Job.JobAttributes;
using Microsoft.AspNetCore.Builder;
using Quartz;
using Quartz.Impl;
using Quartz.Impl.Matchers;
using System.Collections.Specialized;
using System.Reflection;
namespace JSMachine.WMS.Job
{
/// <summary>
/// Quartz 作业调度引擎,根据 JobAttribute 自动发现并注册作业。
/// </summary>
public static class JobEngine
{
/// <summary>
/// 启动 Quartz 调度器,并按作业属性创建周期触发器。
/// 作业执行由 Quartz 管理,调用方无需等待单次作业完成。
/// </summary>
public async static void UseAllJobs(this IApplicationBuilder app)
{
List<(Type, JobAttribute)> tuples = ResolveAllJobTypes();
ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
IScheduler scheduler = await schedulerFactory.GetScheduler();
await scheduler.Start();
// 每个作业独立创建 JobDetail 和 Trigger,避免不同作业共享调度配置。
tuples?.ForEach(async tuple =>
{
IJobDetail jobDetail = JobBuilder
.Create(tuple.Item1)
.WithIdentity(tuple.Item2.Name, tuple.Item2.Group)
.Build();
TriggerBuilder triggerBuilder = TriggerBuilder
.Create()
.WithIdentity($"{tuple.Item2.Name}Trigger", tuple.Item2.Group);
if (tuple.Item2.ScheduleType == ScheduleType.Simple)
{
triggerBuilder.WithSimpleSchedule(p =>
{
p.WithInterval(TimeSpan.FromMilliseconds(tuple.Item2.IntervalMilliSeconds));
if (tuple.Item2.RepeatCount > 0)
{
p.WithRepeatCount(tuple.Item2.RepeatCount);
}
else
{
p.RepeatForever();
}
});
}
ITrigger trigger = triggerBuilder.Build();
await scheduler.ScheduleJob(jobDetail, trigger);
});
}
private static List<(Type, JobAttribute)> ResolveAllJobTypes()
{
Assembly assembly = typeof(JobEngine).Assembly;
//获取所有类
Type[] jobTypes = assembly
.GetTypes()
.Where(t => t.IsDefined(typeof(JobAttribute), false) && typeof(IJob).IsAssignableFrom(t))
.ToArray();
List<(Type, JobAttribute)> tuples = new();
//获取类定义的
foreach (Type jobType in jobTypes)
{
object[] attrs = jobType.GetCustomAttributes(typeof(JobAttribute), false);
if (attrs.Length > 0)
{
foreach (var attr in attrs)
{
if (attr is JobAttribute attribute)
{
tuples.Add((jobType, attribute));
}
}
}
}
return tuples;
}
}
}