#region << 版 本 注 释 >>
|
/*----------------------------------------------------------------
|
* 命名空间:WIDESEAWCS_QuartzJob
|
* 创建者:胡童庆
|
* 创建时间:2024/8/2 16:13:36
|
* 版本:V1.0.0
|
* 描述:调度服务配置业务实现层
|
*
|
* ----------------------------------------------------------------
|
* 修改人:
|
* 修改时间:
|
* 版本:V1.0.1
|
* 修改说明:
|
*
|
*----------------------------------------------------------------*/
|
#endregion << 版 本 注 释 >>
|
|
using OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime;
|
using Quartz.Impl.Matchers;
|
using Quartz;
|
using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Text;
|
using System.Threading.Tasks;
|
using WIDESEAWCS_Core;
|
using WIDESEAWCS_Core.BaseRepository;
|
using WIDESEAWCS_Core.BaseServices;
|
using WIDESEAWCS_Core.Helper;
|
|
using WIDESEAWCS_QuartzJob.DeviceEnum;
|
using WIDESEAWCS_QuartzJob.DTO;
|
using WIDESEAWCS_QuartzJob.Models;
|
using WIDESEAWCS_QuartzJob.Repository;
|
using Quartz.Impl;
|
using System.Collections.Specialized;
|
|
namespace WIDESEAWCS_QuartzJob.Service
|
{
|
public class DispatchInfoService : ServiceBase<Dt_DispatchInfo, IDispatchInfoRepository>, IDispatchInfoService
|
{
|
private readonly IUnitOfWorkManage _unitOfWorkManage;
|
private readonly IDeviceInfoRepository _deviceInfoRepository;
|
private readonly ISchedulerCenter _schedulerCenter;
|
public DispatchInfoService(IDispatchInfoRepository BaseDal, IUnitOfWorkManage unitOfWorkManage, IDeviceInfoRepository deviceInfoRepository, ISchedulerCenter schedulerCenter) : base(BaseDal)
|
{
|
_unitOfWorkManage = unitOfWorkManage;
|
_deviceInfoRepository = deviceInfoRepository;
|
_schedulerCenter = schedulerCenter;
|
}
|
|
/// <summary>
|
/// 查询调度服务Job与对应的设备信息。
|
/// </summary>
|
/// <returns>返回调度服务JobDTO集合。</returns>
|
public List<DispatchInfoDTO> QueryDispatchInfos()
|
{
|
return Db.Queryable<Dt_DispatchInfo, Dt_DeviceInfo>((a, b) => a.JobGroup == b.DeviceType && b.DeviceStatus == ((int)DeviceStatusEnum.Enable).ToString()).Select((a, b) => new DispatchInfoDTO
|
{
|
JobGroup = a.JobGroup,
|
AssemblyName = a.AssemblyName,
|
BeginTime = a.BeginTime,
|
ClassName = a.ClassName,
|
CreateDate = a.CreateDate,
|
Creater = a.Creater,
|
CycleHasRunTimes = 0,
|
EndTime = a.EndTime,
|
Id = b.Id,
|
IntervalSecond = a.IntervalSecond,
|
Modifier = a.Modifier,
|
ModifyDate = a.ModifyDate,
|
Name = a.Name,
|
Remark = a.Remark,
|
DeviceType = b.DeviceType
|
}).ToList();
|
}
|
|
public async Task<WebResponseContent> GetDispatchInfosAsync()
|
{
|
WebResponseContent content = new WebResponseContent();
|
NameValueCollection collection = new NameValueCollection
|
{
|
{ "quartz.serializer.type", "binary" },
|
};
|
StdSchedulerFactory factory = new StdSchedulerFactory(collection);
|
IScheduler scheduler = await factory.GetScheduler();
|
var jobKeys = await scheduler.GetJobKeys(GroupMatcher<JobKey>.AnyGroup());
|
foreach (var jobKey in jobKeys)
|
{
|
// 在这里处理每个JobKey
|
IJobDetail jobDetail = await scheduler.GetJobDetail(jobKey);
|
if (jobDetail != null)
|
{
|
// 可以获取Job的描述信息
|
string jobDescription = jobDetail.Description;
|
// 以及Job的数据映射(JobDataMap)
|
JobDataMap jobDataMap = jobDetail.JobDataMap;
|
}
|
}
|
|
var triggerKeys = await scheduler.GetTriggerKeys(GroupMatcher<TriggerKey>.AnyGroup());
|
foreach (var triggerKey in triggerKeys)
|
{
|
// 在这里处理每个TriggerKey
|
ITrigger trigger = await scheduler.GetTrigger(triggerKey);
|
if (trigger != null)
|
{
|
// 获取下一次触发时间(如果有)
|
DateTimeOffset? nextFireTime = trigger.GetNextFireTimeUtc();
|
// 获取上次触发时间(如果有)
|
DateTimeOffset? previousFireTime = trigger.GetPreviousFireTimeUtc();
|
// 获取触发类型(如SimpleTrigger、CronTrigger)
|
string triggerType = trigger.GetType().Name;
|
// 对于CronTrigger,还可以获取Cron表达式(如果是)
|
//if (trigger is CronTrigger cronTrigger)
|
//{
|
// string cronExpression = cronTrigger.CronExpressionString;
|
//}
|
if (!previousFireTime.HasValue && nextFireTime.HasValue)
|
{
|
Console.WriteLine($"Job处于等待触发状态,Trigger名称: {triggerKey.Name}");
|
}
|
}
|
}
|
return content;
|
}
|
}
|
}
|