using Hangfire; using Hangfire.Storage; using IRaCIS.Core.Application.Helper; using IRaCIS.Core.Application.MassTransit.Consumer; using IRaCIS.Core.Domain.Models; using IRaCIS.Core.Domain.Share; using MassTransit; using MassTransit.Mediator; using MassTransit.Scheduling; using Microsoft.Extensions.Logging; using NPOI.SS.Formula.Functions; namespace IRaCIS.Core.Application.Service.BackGroundJob { public interface IIRaCISHangfireJob { Task InitHangfireJobTaskAsync(); } public class IRaCISCHangfireJob(ILogger _logger, IRepository _trialEmailNoticeConfigRepository, IBus _bus ) : IIRaCISHangfireJob { public static string JsonFileFolder = Path.Combine(AppContext.BaseDirectory, StaticData.Folder.Resources); public async Task InitHangfireJobTaskAsync() { _logger.LogInformation("项目启动 hangfire 任务初始化 执行开始~"); //创建邮件定时任务 await InitSysAndTrialCronJobAsync(); _logger.LogInformation("项目启动 hangfire 任务初始化 执行结束"); } public async Task InitSysAndTrialCronJobAsync() { //项目定时任务都在default 队列 var dbJobIdList = JobStorage.Current.GetConnection().GetRecurringJobs().Where(t => t.Queue == "default").Select(t => t.Id).ToList(); foreach (var jobId in dbJobIdList) { HangfireJobHelper.RemoveCronJob(jobId); } var taskInfoList = await _trialEmailNoticeConfigRepository.Where(t => t.Trial.TrialStatusStr == StaticData.TrialState.TrialOngoing && t.EmailCron != string.Empty && t.IsAutoSend) .Select(t => new { t.Id, t.Code, TrialCode=t.Trial.TrialCode, t.EmailCron, t.BusinessScenarioEnum, t.TrialId }) .ToListAsync(); foreach (var task in taskInfoList) { //利用主键作为任务Id var jobId = $"{task.TrialId}({task.TrialCode})_{task.Id}({task.BusinessScenarioEnum})"; var trialId = task.TrialId; HangfireJobHelper.AddOrUpdateTrialCronJob(jobId, trialId, task.BusinessScenarioEnum, task.EmailCron); } //var schedulerEndpoint = await _bus.GetSendEndpoint(new Uri("queue:sys_init")); //await schedulerEndpoint.ScheduleRecurringSend(new Uri("queue:mt-message-queue"), new QCImageQuestionSchedule() { ScheduleId = jobId, CronExpression = "0 0/1 * 1/1 * ? *" }, new PollExternalSystem { }); //await schedulerEndpoint.ScheduleRecurringSend(new Uri("queue:sys_init"), new QCImageQuestionSchedule() { ScheduleId = jobId + jobId, CronExpression = "0 0/1 * 1/1 * ? *" }, new PollExternalSystem { }); //HangfireJobHelper.AddOrUpdateCronJob("test-MasstransiTestCommand", t => t.Send(new MasstransiTestCommand { value = "message at " + DateTime.Now.ToString() }, default), "0/3 * * * * ? "); //await _bus.ScheduleRecurringSend(new Uri("queue:mt-message-queue"), new QCImageQuestionSchedule() { ScheduleId = jobId, CronExpression = "0 0/1 * 1/1 * ? *" }, new QCImageQuestionSchedule { }); } public class PollExternalSystem { } } }