背景:quartz的job方法默认都是无参数的,如果直接写构造函数注入service会没反应。那么我们就需要处理下,使quartz支持构造函数的注入。
实现:
这里提供两个demo例子,一个控制台项目和一个webapi项目
webapi项目:
1,安装nuget包,打开Visual Studio或你的开发环境,然后添加以下包:
Quartz
Quartz.AspNetCore
2,注册Quartz.NET服务
#region 注册job
Services.AddSingleton<QuartzUpdateChnState>();
Services.AddSingleton<QuartzUpdateDevState>();
Services.AddSingleton<TestJobOperation>();
Services.AddSingleton<SendAlarmJob>();
#endregion
/// <summary>
/// 定时检测更新设备通道的连接状态
/// </summary>
/// <param name="interval">请求间隔(分钟)</param>
public static void QuartzUpdateChannelConnState(int interval)
{
var _jobMap = new JobDataMap { { "AdapterData", new ChnStateQuartzDto() } };
var _job = JobBuilder.Create<QuartzUpdateChnState>().UsingJobData(_jobMap).Build();
var _trigger = TriggerBuilder.Create().WithSimpleSchedule(s => s.WithIntervalInSeconds(5).RepeatForever())
.Build();
Scheduler?.ScheduleJob(_job, _trigger);
}
using Microsoft.Extensions.DependencyInjection;
using Quartz;
using Quartz.Spi;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Lims.Quartz
{
/// <summary>
/// MyJobFactory 自定义的job工厂,可以使用参数构造函数注入
/// </summary>
public class LimsJobFactory : IJobFactory
{
private readonly IServiceProvider _serviceProvider;
public LimsJobFactory(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
{
try
{
return _serviceProvider.GetRequiredService(bundle.JobDetail.JobType) as IJob;
}
catch (Exception ex)
{
throw;
}
}
public void ReturnJob(IJob job)
{
var disposable = job as IDisposable;
disposable?.Dispose();
}
}
}
控制台项目:
参考文献:
在Quartz .NET的工作类中使用依赖注入 - exxxxia - 博客园 (cnblogs.com)
结语:
如果不用仓储模式去使用quartz的话,没必要以上的操作。只需要去找一下c#使用quartz即可。