Quartz.Net线程处理用到的两个Attribute
1.DisallowConcurrentExecution
加到IJob实现类上,主要防止相同JobDetail并发执行。
简单来说,现在有一个实现了IJob接口的CallJob,触发器设置的时间是每5s执行一次,但是由于执行过程的时间大于5s,在Quartz scheduler的下一次执行时间到了,那么就会开启另外一个线程执行CallJob,说着有点绕,来点代码吧。
Common.Logging.LogManager.Adapter = new Common.Logging.Simple.ConsoleOutLoggerFactoryAdapter { Level = Common.Logging.LogLevel.Info };
IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();
scheduler.Start();
IJobDetail job = JobBuilder.Create<CallJob>().WithIdentity("calljob", "call")
.UsingJobData("hello", )//先忽略,第二个特性用到
.Build();
//触发器
ITrigger trigger = TriggerBuilder.Create().WithIdentity("calljobtrigger", "call").StartNow().WithSimpleSchedule(x => x.WithIntervalInSeconds().RepeatForever()).Build();
scheduler.ScheduleJob(job, trigger);
Thread.Sleep(TimeSpan.FromSeconds());
scheduler.Shutdown();
public class CallJob : IJob
{ public void Execute(IJobExecutionContext context)
{
int i = (int)context.JobDetail.JobDataMap["hello"];//先忽略,第二个特性用到
Console.WriteLine("=====call======"+(i));
Console.WriteLine("call【" + Thread.CurrentThread.ManagedThreadId + "】" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
i++;
context.JobDetail.JobDataMap.Put("hello", i);//先忽略,第二个特性用到
Thread.Sleep();
Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "call执行完毕【" + Thread.CurrentThread.ManagedThreadId); }
}
从代码中可以看到我们设置的trrigger是5秒执行一次,在CallJob的Execute中,让线程sleep 8s,这样就能模拟刚才说的情况了,先看下不加DisallowConcurrentExecution的结果

第一张图是不加特性的,第二张图是加上特性的。图一中不难发现,线程10在休眠的时候,由于scheduler规划的trigger已经触发,会立即执行,不去管上次任务是否执行完成,从而出现了同一个Job并行。图二就不会出现并行的情况,当第一次任务还没有执行完成的时候,即使规划的trigger的触发时间到了也不会立即执行,而是等待上次任务完成再执行,依次顺延,保证了相同JobDetail串行。说明一下DisallowConcurrentExecution是禁止相同JobDetail同时执行,而不是禁止多个不同JobDetail同时执行。建议加上该特性,防止由于任务执行时间太长,长时间占用资源,导致其它任务堵塞。
2.PersistJobDataAfterExecution
加到IJob实现类上,主要表示当正常执行完Job后, JobDataMap中的数据应该被改动, 以被下一次调用时用。还是上面的代码,只是将特性DisallowConcurrentExecution换成了PersistJobDataAfterExecution,特别注意代码中【先忽略】部分。
当不使用PersistJobDataAfterExecution特性时,每次取出来的hello键值对的value始终都是0,也就是说每次执行 JobDataMap中的数据都是全新的一份,加上特性PersistJobDataAfterExecution之后,就会出现数据共享。没加特性的结果可以看上图,加上之后看下图。

注意当使用【PersistJobDataAfterExecution】特性时, 为了避免并发时, 存储数据造成混乱, 强烈建议把【DisallowConcurrentExecution】特性也加上。
本人很菜,欢迎拍砖。
Quartz.Net线程处理用到的两个Attribute的更多相关文章
- 企业级任务调度框架Quartz(8) 线程在Quartz里的意义(2)
前序: 做为企业里的任务调度框架,出现同一时间点同时运行两个任务,或者两个任务因为开始的执行时间和执行时间的长短,很有可能出现任务并发执行的情况:因为Quartz的实现是采用java编程,那 ...
- Quartz的线程池解析
[org.quartz.core相关类图] 可以看到核心类为QuartzScheduler [QuartzScheduler构造函数] public QuartzScheduler(QuartzSch ...
- quartz自定义线程数
1.加载包 2.添加quartz.propertes 3.编写自己的任务类 4.添加自动任务配置 5.通过 quartzProperties 配置连接池 1.加载包 <dependency> ...
- netty的线程池-----揭示了使用两个线程池的原因
线程模型是Netty的核心设计,设计地很巧妙,之前项目中有一块处理并发的设计和Netty的Eventloop单线程设计类似,效果得到了实证. Netty5的类层次结构和之前的版本变化很大,网上也有很多 ...
- Jmeter 跨线程组传递参数 之两种方法
终于搞定了Jmeter跨线程组之间传递参数,这样就不用每次发送请求B之前,都需要同时发送一下登录接口(因为同一个线程组下的请求是同时发送的),只需要发送一次登录请求,请求B直接用登录请求的参数即可,直 ...
- 企业级任务调度框架Quartz(7) 线程在Quartz里的意义(1)
1.Java 中的线程 线程允许程序同一时间做很多任务,至少,看起来那些任务是并发执行的.在我的并发编程的帖子里有介绍线程的基本概念:我们知道在任一特定时刻仅有一个线程 在执行,但是 CPU ...
- 【柠檬班】史上最简单的Jmeter跨线程组取参数值的两种办法(不写代码)【原创】
如果你工作中已经在用jmeter做接口测试,或性能测试了,你可能会遇到一个麻烦,哪就是jmeter的变量值不能跨线程组传递. 看,官方就已经给出了解释.这个不是jmeter的缺陷,这是jmeter ...
- Jmeter 跨线程组传递参数 之两种方法(转)
终于搞定了Jmeter跨线程组之间传递参数,这样就不用每次发送请求B之前,都需要同时发送一下登录接口(因为同一个线程组下的请求是同时发送的),只需要发送一次登录请求,请求B直接用登录请求的参数即可,直 ...
- JMeter接口测试-跨线程组取参数值的两种方法
前言 如果你工作中已经在用jmeter做接口测试,或性能测试了,你可能会遇到一个麻烦.那就是jmeter的变量值不能跨线程组传递.如果变量在开始测试之前已经确定了,我们可以用参数化关联就可以实现. 但 ...
随机推荐
- 如何修改wamp目录【成功】
Wampserver安装好后,“www目录”默认为X:/wamp/www,(这里的X是盘符)也就是wampserver安装目录下的www文件夹.实际使用中,默认设置往往不是我们想要的,可能改成其他文件 ...
- 洛谷 P1308 统计单词数【string类及其函数应用/STL】
题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数. 现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给 ...
- 用JDBC操作MySQL——大量数据库操作时使用批处理提速
之前所有的操作由于数据量很小,所以没有进行批处理的优化,性能也没有出现明显的恶化,但是随着我用java处理数据量的大幅提高,频繁使用静态SQL语句的方法严重降低了处理效率,这里总结一下JDBC批处理的 ...
- 几何+暴力【p1959】 遗址[NOI导刊2009普及(6)]
题目描述--> P1959 遗址_NOI导刊2009普及(6) 普通方法分析: 因为题目要求是找最大正方形(如果是长方形更麻烦. 讲真,题目不难,耗时间! 根据题目要求,我们要找的是正方形. 我 ...
- 01、Mecanim动画系统
序言:Mecanim动画系统是Unity4.0之后退出的新版动画系统,非常适合人类动画系统.本文是作为自己的学习来讲解的, 可能会有些啰嗦,但尽量把自己的坑都为大家列出来,让大家理解透彻. 一.文件的 ...
- Java多线程——ReentrantLock源码阅读
上一章<AQS源码阅读>讲了AQS框架,这次讲讲它的应用类(注意不是子类实现,待会细讲). ReentrantLock,顾名思义重入锁,但什么是重入,这个锁到底是怎样的,我们来看看类的注解 ...
- redis踩坑记
本来打算给一批主库做从库,用来读取数据,还不想碰主库数据. 主库redis2.8.12,从库一开始没注意,docker了一个3.1的,结果slaveof之后命令不兼容,下了一个2.8的(2.8.23好 ...
- [读书笔记]iOS 7 UI设计 对比度
好久没写随笔了,最近在读<iOS 7 byTutorials>,很不错,推荐给大家. 每一个好的程序员也都是一个设计师,不懂设计的程序员不是好的CTO.哈哈,开个小玩笑. iOS 7设计的 ...
- C语言实现汉诺塔问题
代码如下: #include <stdio.h> #include <stdlib.h> void move(int n,char x,char y,char z) { ) { ...
- JQuery给动态HTML绑定事件
说明:涉及到事件委托原理,这里不深究了. 直接使用live或者delegate去实现.网上说on也可以,没测试过. 注意:live在新版的JQuery已经取消.on在比较新的版本才支持. 参考: ht ...