net core 使用quartz

------------恢复内容开始------------

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;
                }

 

posted @ 2022-04-20 17:35  青兰柳  阅读(61)  评论(0编辑  收藏  举报