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