net core 使用quartz
------------恢复内容开始------------
1
SimpleJobFactory
工厂类定义了生成Job任务的过程:利用反射机制
调用无参构造函数
形成的Job实例
很多时候,定义的Job任务依赖了其他服务(该Job定义有参构造函数),此时默认的SimpleJobFactory不能满足实例化要求,考虑自定义Job工厂类。
public class CustomizeJobFactory : IJobFactory { /// <summary> /// 容器提供器, /// </summary> protected IServiceProvider _serviceProvider; public CustomizeJobFactory(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; } /// <summary> /// 返回IJob /// </summary> /// <param name="bundle"></param> /// <param name="scheduler"></param> /// <returns></returns> public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler) { //Job类型 Type jobType = bundle.JobDetail.JobType; //返回jobType对应类型的实例 return _serviceProvider.GetService(jobType) as IJob; } /// <summary> /// 清理销毁IJob /// </summary> /// <param name="job"></param> public void ReturnJob(IJob job) { var disposable = job as IDisposable; disposable?.Dispose(); } }
在myjob中,无法操作数据库,总是报错(abp框架中)
System.ArgumentNullException: Value cannot be null. (Parameter 'unitOfWork')
解决办法在方法中加virtual
方法上加特性【unitofwork】
如果让它执行一个任务在执行下一个
在类中加注解
[DisallowConcurrentExecutionAttribute]
另一个可以自定义线程锁
private static readonly Object syncObject = new object(); private static bool _isRunning; 在方法里面 lock (syncObject) { if (_isRunning) { return; } _isRunning = true; } try { } finally{ lock (syncObject) { _isRunning = false; }