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的更多相关文章

  1. 企业级任务调度框架Quartz(8) 线程在Quartz里的意义(2)

    前序:      做为企业里的任务调度框架,出现同一时间点同时运行两个任务,或者两个任务因为开始的执行时间和执行时间的长短,很有可能出现任务并发执行的情况:因为Quartz的实现是采用java编程,那 ...

  2. Quartz的线程池解析

    [org.quartz.core相关类图] 可以看到核心类为QuartzScheduler [QuartzScheduler构造函数] public QuartzScheduler(QuartzSch ...

  3. quartz自定义线程数

    1.加载包 2.添加quartz.propertes 3.编写自己的任务类 4.添加自动任务配置 5.通过 quartzProperties 配置连接池 1.加载包 <dependency> ...

  4. netty的线程池-----揭示了使用两个线程池的原因

    线程模型是Netty的核心设计,设计地很巧妙,之前项目中有一块处理并发的设计和Netty的Eventloop单线程设计类似,效果得到了实证. Netty5的类层次结构和之前的版本变化很大,网上也有很多 ...

  5. Jmeter 跨线程组传递参数 之两种方法

    终于搞定了Jmeter跨线程组之间传递参数,这样就不用每次发送请求B之前,都需要同时发送一下登录接口(因为同一个线程组下的请求是同时发送的),只需要发送一次登录请求,请求B直接用登录请求的参数即可,直 ...

  6. 企业级任务调度框架Quartz(7) 线程在Quartz里的意义(1)

    1.Java 中的线程     线程允许程序同一时间做很多任务,至少,看起来那些任务是并发执行的.在我的并发编程的帖子里有介绍线程的基本概念:我们知道在任一特定时刻仅有一个线程 在执行,但是 CPU ...

  7. 【柠檬班】史上最简单的Jmeter跨线程组取参数值的两种办法(不写代码)【原创】

    如果你工作中已经在用jmeter做接口测试,或性能测试了,你可能会遇到一个麻烦,哪就是jmeter的变量值不能跨线程组传递.   看,官方就已经给出了解释.这个不是jmeter的缺陷,这是jmeter ...

  8. Jmeter 跨线程组传递参数 之两种方法(转)

    终于搞定了Jmeter跨线程组之间传递参数,这样就不用每次发送请求B之前,都需要同时发送一下登录接口(因为同一个线程组下的请求是同时发送的),只需要发送一次登录请求,请求B直接用登录请求的参数即可,直 ...

  9. JMeter接口测试-跨线程组取参数值的两种方法

    前言 如果你工作中已经在用jmeter做接口测试,或性能测试了,你可能会遇到一个麻烦.那就是jmeter的变量值不能跨线程组传递.如果变量在开始测试之前已经确定了,我们可以用参数化关联就可以实现. 但 ...

随机推荐

  1. Unable to connect to vulnerability scanner

    问题:   "Unable to connect to vulnerability scanner. If the system has been updated recently the ...

  2. zabbix获取到的数值自定义单位

    1) 查找php文件 # find / -name "func.inc.php" /usr/share/zabbix/include/func.inc.php 2)修改文件 #vi ...

  3. linux 批量替换所有文件中包含的字符串

    sed -i "s/原来字符串/新字符串/g" `grep 原来字符串 -rl .` 格式: sed -i "s/查找字段/替换字段/g" `grep 查找字段 ...

  4. 洛谷 P3927 SAC E#1 - 一道中档题 Factorial【数论//】

    题目描述 SOL君很喜欢阶乘.而SOL菌很喜欢研究进制. 这一天,SOL君跟SOL菌炫技,随口算出了n的阶乘. SOL菌表示不服,立刻就要算这个数在k进制表示下末尾0的个数. 但是SOL菌太菜了于是请 ...

  5. 拓扑排序(Topological Order)UVa10305 Ordering Tasks

    2016/5/19 17:39:07 拓扑排序,是对有向无环图(Directed Acylic Graph , DAG )进行的一种操作,这种操作是将DAG中的所有顶点排成一个线性序列,使得图中的任意 ...

  6. RID枚举工具RidEnum

    RID枚举工具RidEnum   RID(Relative ID)是域RID主机为域内用户.组或者计算机对象分配的标识.RID和域的SID就构成该对象的SID.RidEnum是一个RID循环攻击工具. ...

  7. [BZOJ 1833] 数字计数

    Link: BZOJ 1833 传送门 Solution: 比较明显的数位DP 先预处理出1~9和包括前导0的0的个数:$pre[i]=pre[i-1]*10+10^{digit-1}$ (可以分为首 ...

  8. 反序显示一个整数 Exercise06_04

    import java.util.Scanner; /** * @author 冰樱梦 * 时间:2018年下半年 * 题目:反序显示一个整数 * */ public class Exercise06 ...

  9. 关于 xk 的位数。

    关于 xk 的位数. 如果x大于0小于l,那么位数=1+小数部分×k, 如果x≥l,那么位数=trunc(ln(x)/ln(10)×k)+1+小数部分×k. trunc//向下取整

  10. pgmagick,pil不保存图片并且获取图片二进制数据记录

    PIL和pgmagick都是python中图像处理的库,只不过PIL功能更强大 pgmagick和PIL中对数据进行调整后经常需要调用write或者save方法保存图片,然后在读取图片的内容,这样很麻 ...