quartz集群原理2

 
一般是需要设置 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 的作用是什么? 你一定会很疑惑,感觉是控制并发执行用的,其实呢,并不是,它控制是否允许 多线程执行。就是说, 一个任务呢, 还是只能有一个线程执行, 不允许多线程执行。


版权声明
本文原创发表于 博客园,作者为 阿K .     本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。
欢迎关注本人微信公众号:觉醒的码农,或者扫码进群:

原文地址:https://www.cnblogs.com/FlyAway2013/p/15172036.html