要求Quartz版本高于3.2
安装Install-Package Quartz.Extensions.Hosting
Quartz.Extensions.Hosting
包中包含Quartz.Extensions.DependencyInjection
, 详情请查询Quartz.Extensions.DependencyInjection Documents
下面是QuartzExtensions的代码,用于对Quartz的初始化
| public static IServiceCollection AddMyQuartz(this IServiceCollection services) |
| { |
| services.AddQuartz(configure => |
| { |
| configure.SchedulerId = "QRTZ"; |
| configure.UseMicrosoftDependencyInjectionJobFactory(); |
| configure.UseSimpleTypeLoader(); |
| configure.UseInMemoryStore(); |
| configure.UseDedicatedThreadPool(options => |
| { |
| options.MaxConcurrency = 10; |
| }); |
| |
| var scriberPollingJobKey = JobKey.Create(IQuartzService.ScriberPolling); |
| configure.AddJob<ScriberPollingJob>(scriberPollingJobKey); |
| configure.AddTrigger(c => |
| { |
| c.ForJob(scriberPollingJobKey) |
| .WithCronSchedule("*/1 * * * * ?"); |
| }); |
| |
| var welder1PollingJobKey = JobKey.Create(IQuartzService.Welder1Polling); |
| configure.AddJob<Welder1PollingJob>(welder1PollingJobKey); |
| configure.AddTrigger(c => |
| { |
| c.ForJob(welder1PollingJobKey) |
| .WithCronSchedule("*/1 * * * * ?"); |
| }); |
| |
| var welder2PollingJobKey = JobKey.Create(IQuartzService.Welder2Polling); |
| configure.AddJob<Welder2PollingJob>(welder2PollingJobKey); |
| configure.AddTrigger(c => |
| { |
| c.ForJob(welder2PollingJobKey) |
| .WithCronSchedule("*/1 * * * * ?"); |
| }); |
| |
| var hslHealthJobKey = JobKey.Create(IQuartzService.HSLHealth); |
| configure.AddJob<HSLHealthJob>(hslHealthJobKey); |
| configure.AddTrigger(c => |
| { |
| c.ForJob(hslHealthJobKey) |
| .StartNow() |
| .WithCronSchedule("*/10 * * * * ?"); |
| }); |
| }); |
| services.AddQuartzHostedService(options => |
| { |
| options.WaitForJobsToComplete = true; |
| }); |
| |
| return services; |
| } |
| } |
下面是对于Job管理的代码
| public interface IQuartzService |
| { |
| const string HSLHealth = nameof(HSLHealth); |
| const string ScriberPolling = nameof(ScriberPolling); |
| const string Welder1Polling = nameof(Welder1Polling); |
| const string Welder2Polling = nameof(Welder2Polling); |
| |
| |
| |
| |
| public void AddJob(IJobDetail jobDetail, ITrigger trigger); |
| |
| |
| |
| Task PauseAll(); |
| |
| |
| |
| Task ResumeAll(); |
| |
| |
| |
| Task PauseJob(string key); |
| |
| |
| |
| Task ResumeJob(string key); |
| |
| |
| |
| Task PauseJobs(string group); |
| |
| |
| |
| Task ResumeJobs(string group); |
| |
| |
| |
| Task Shutdown(); |
| |
| } |
| public class QuartzService : IQuartzService |
| { |
| private readonly ILogger<QuartzService> _logger; |
| private IScheduler _scheduler; |
| |
| public QuartzService(ILogger<QuartzService> logger, ISchedulerFactory factory) |
| { |
| _logger = logger; |
| Task.Run(async () => _scheduler = await factory.GetScheduler().ConfigureAwait(false)); |
| } |
| |
| public void AddJob(IJobDetail jobDetail, ITrigger trigger) |
| { |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| _scheduler.ScheduleJob(jobDetail, trigger); |
| } |
| |
| public async Task PauseAll() |
| { |
| await _scheduler.PauseAll(); |
| } |
| |
| public async Task ResumeAll() |
| { |
| await _scheduler.ResumeAll(); |
| } |
| |
| public async Task PauseJob(string key) |
| { |
| await _scheduler.PauseJob(JobKey.Create(key)); |
| } |
| |
| public async Task ResumeJob(string key) |
| { |
| await _scheduler.ResumeJob(JobKey.Create(key)); |
| } |
| |
| public async Task PauseJobs(string group) |
| { |
| await _scheduler.PauseJobs(GroupMatcher<JobKey>.GroupEquals(group)); |
| } |
| |
| public async Task ResumeJobs(string group) |
| { |
| await _scheduler.ResumeJobs(GroupMatcher<JobKey>.GroupEquals(group)); |
| } |
| |
| public async Task Shutdown() |
| { |
| await _scheduler.Shutdown(true); |
| } |
| } |
拿出初始化中的一个Job来查看效果
| [DisallowConcurrentExecution] |
| public class HSLHealthJob : IJob |
| { |
| private readonly ILogger<HSLHealthJob> _logger; |
| private readonly HSLService _hsl; |
| private readonly SettingViewModel _setting; |
| |
| public HSLHealthJob(ILogger<HSLHealthJob> logger, HSLService hsl, SettingViewModel setting) |
| { |
| _logger = logger; |
| _hsl = hsl; |
| _setting = setting; |
| |
| _hsl.ScriberS7Net.ReceiveTimeOut = 500; |
| _hsl.Welder1S7Net.ReceiveTimeOut = 500; |
| _hsl.Welder2S7Net.ReceiveTimeOut = 500; |
| } |
| |
| public async Task Execute(IJobExecutionContext context) |
| { |
| |
| var status = _hsl.ScriberS7Net.IpAddressPing(); |
| if (status == IPStatus.Success) |
| { |
| if (!_hsl.ScriberS7NetConnected) |
| { |
| var result = await _hsl.ScriberS7Net.ConnectServerAsync(); |
| if (result.IsSuccess) |
| { |
| _hsl.ScriberS7NetConnected = true; |
| _setting.ScriberConnectionState = "连接成功"; |
| _setting.ScriberConnectionColor = Colors.GreenYellow; |
| } |
| |
| if (!_hsl.ScriberS7NetConnected) |
| { |
| _setting.ScriberConnectionState = "网络异常"; |
| _setting.ScriberConnectionColor = Colors.OrangeRed; |
| } |
| } |
| } |
| else |
| { |
| _logger.LogWarning($"Ping {_hsl.ScriberS7Net.IpAddress} {status}"); |
| if (_hsl.ScriberS7NetConnected) |
| await _hsl.ScriberS7Net.ConnectCloseAsync(); |
| _hsl.ScriberS7NetConnected = false; |
| _setting.ScriberConnectionState = "网络异常"; |
| _setting.ScriberConnectionColor = Colors.OrangeRed; |
| } |
| |
| status = _hsl.Welder1S7Net.IpAddressPing(); |
| if (status == IPStatus.Success) |
| { |
| if (!_hsl.Welder1S7NetConnected) |
| { |
| var result = await _hsl.Welder1S7Net.ConnectServerAsync(); |
| if (result.IsSuccess) |
| { |
| _hsl.Welder1S7NetConnected = true; |
| _setting.Welder1ConnectionState = "连接成功"; |
| _setting.Welder1ConnectionColor = Colors.GreenYellow; |
| } |
| |
| if (!_hsl.Welder1S7NetConnected) |
| { |
| _setting.Welder1ConnectionState = "网络异常"; |
| _setting.Welder1ConnectionColor = Colors.OrangeRed; |
| } |
| } |
| } |
| else |
| { |
| _logger.LogWarning($"Ping {_hsl.Welder1S7Net.IpAddress} {status}"); |
| if (_hsl.Welder1S7NetConnected) |
| await _hsl.Welder1S7Net.ConnectCloseAsync(); |
| _hsl.Welder1S7NetConnected = false; |
| _setting.Welder1ConnectionState = "网络异常"; |
| _setting.Welder1ConnectionColor = Colors.OrangeRed; |
| } |
| |
| status = _hsl.Welder2S7Net.IpAddressPing(); |
| if (status == IPStatus.Success) |
| { |
| if (!_hsl.Welder2S7NetConnected) |
| { |
| var result = await _hsl.Welder2S7Net.ConnectServerAsync(); |
| if (result.IsSuccess) |
| { |
| _hsl.Welder2S7NetConnected = true; |
| _setting.Welder2ConnectionState = "连接成功"; |
| _setting.Welder2ConnectionColor = Colors.GreenYellow; |
| } |
| |
| if (!_hsl.Welder2S7NetConnected) |
| { |
| _setting.Welder2ConnectionState = "网络异常"; |
| _setting.Welder2ConnectionColor = Colors.OrangeRed; |
| } |
| } |
| } |
| else |
| { |
| _logger.LogWarning($"Ping {_hsl.Welder2S7Net.IpAddress} {status}"); |
| if (_hsl.Welder2S7NetConnected) |
| await _hsl.Welder2S7Net.ConnectCloseAsync(); |
| _hsl.Welder2S7NetConnected = false; |
| _setting.Welder2ConnectionState = "网络异常"; |
| _setting.Welder2ConnectionColor = Colors.OrangeRed; |
| } |
| } |
| } |
这个Job运行效果图如下

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
2019-02-28 Homebrew安装Mysql后的两步必要的命令