Quartz.net设置任务中同时最多运行一个实例 [DisallowConcurrentExecution]

Quartz定时任务默认都是并发执行的,不会等待上一次任务执行完毕,只要间隔时间到就会执行, 如果定时任执行太长,会长时间占用资源,导致其它任务堵塞。

比如Job设置1分钟跑一次,每次获取50条短信发送,发送完成后状态设置为已发送。但是可能Job1执行的时间超过1分钟50条短信还没有跑完,这时候Job2 启动了,就会获取全部未发送的记录继续发送。造成重复执行短信发送的问题。

@DisallowConcurrentExecution

此标记用在实现Job的类上面,意思是不允许并发执行,按照我之前的理解是 不允许调度框架在同一时刻调用Job类,后来经过测试发现并不是这样,而是Job(任务)的执行时间[比如需要10秒]大于任务的时间间隔[Interval(5秒)],那么默认情况下,调度框架为了能让 任务按照我们预定的时间间隔执行,会马上启用新的线程执行任务。否则的话会等待任务执行完毕以后 再重新执行!(这样会导致任务的执行不是按照我们预先定义的时间间隔执行)

以C#为例可以很清楚的看出区别.

设置Job每1秒执行一次

IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();
IJobDetail syncFansJob = JobBuilder.Create<CustomerUserJob>()
     .Build();
ITrigger syncFansTrigger = TriggerBuilder.Create()
      .StartNow()
      .WithSimpleSchedule(x => x.WithIntervalInSeconds(1).RepeatForever())
      .Build();
scheduler.ScheduleJob(syncFansJob, syncFansTrigger);
scheduler.Start();

CustomerUserJob

没有设置[DisallowConcurrentExecution]属性,Job每一秒执行一次

    public class CustomerUserJob : IJob
    {
        public void Execute(IJobExecutionContext context)
        {
            ApiCommon.WriteLocalLog("begin job..");
            Thread.Sleep(5*1000);
        }
    }

1秒执行一次

设置[DisallowConcurrentExecution]属性

    [DisallowConcurrentExecution]
    public class CustomerUserJob : IJob
    {
        public void Execute(IJobExecutionContext context)
        {
            ApiCommon.WriteLocalLog("begin job..");
            Thread.Sleep(5*1000);
        }
    }

设置DisallowConcurrentExecution
可以看到Job在每5秒执行一次.

转载于:https://www.cnblogs.com/dupeng0811/p/quartz-net-run-1-instance-of-a-job-with-different-jobkey-and-jobdata.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值