10年 Java程序员,硬核人生!勇往直前,永不退缩!

欢迎围观我的git:https://github.com/R1310328554/spring_security_learn 寻找志同道合的有志于研究技术的朋友,关注本人微信公众号: 觉醒的码农,或Q群 165874185

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
 
一般是需要设置 org.quartz.jobStore.isClustered = true,
 
测试发现, 设置org.quartz.jobStore.isClustered = false 和 true , 表面上差别不是很大。
 
都是一样会执行。
 
 
都是。抢占锁的方式执行。。 不过 不是平均每个节点30s, 而是抢占式。
 
 
但是呢,如果是isClustered = false , 那么没有 ClusterManager线程, 自然不会有异常恢复、转移等功能。 如果是集群模式的话,是有的。
 
 ...
 
另外,如果是集群模式,那么 getLockHandler() 是DBSemaphore , 其obtainLock 方法需要真正的执行sql, 需要 在 qrtz_lock 表中新增行等等。
 
而如果非集群模式,那么 getLockHandler() 是SimpleSemaphore , 其obtainLock 方法不需要真正的执行sql,不需要数据库:
public boolean requiresConnection() {
return false;
}
 
也 不需要 在 qrtz_lock 表中新增行等等, 而仅仅是 jvm 内部防止即可!!。
 
 
quartz的集群, 其实跟单个quartz实例差不多, 因为它支持是任务调度方式还是一样的, 也就是通过数据库表进行控制,本质是一样的, 对于某个任务的调度, 只支持一个实例运行, 不能设置为所有实例都运行一遍。
 
就是说,任何时刻,一个任务调度, 只能在一个节点实例上运行! 这一点是和其他的任务调度框架差别比较大的! 
 
所以呢,我认为,它并不是真正的分布式的集群! 这个需要引起注意!
 

另外,DisallowConcurrentExecution 的作用是什么? 你一定会很疑惑,感觉是控制并发执行用的,其实呢,并不是,它控制是否允许 多线程执行。就是说, 一个任务呢, 还是只能有一个线程执行, 不允许多线程执行。

 

posted on 2021-08-22 13:39  CanntBelieve  阅读(316)  评论(0编辑  收藏  举报