SpringBoot Quartz实现:如何仅在单台机器运行调度器
问题解答
@DissallowConcurrentExecution不能解决你这个多机器部署的重复执行问题。
这个注解的作用很明确:它只是用来阻止同一个JobDetail实例在单台机器上被多个线程同时执行,说白了就是管单机器内的并发冲突,完全覆盖不了多机器的场景——两台机器上的调度器是独立的进程,这个注解根本管不到对方。
要实现多机器只让一台跑调度、避免重复操作的需求,有两种靠谱的方案:
- 用Quartz集群模式:把两台机器的Quartz配置成共享同一个数据库作为任务存储(不能用内存存储RAMJobStore,得用JDBC类型的JobStoreTX/JobStoreCMT)。Quartz集群会自动通过数据库做分布式协调,同一个定时任务只会被集群中的某一个节点触发执行,天然避免重复。
- 手动实现分布式锁:在任务执行前,先通过数据库行锁、Redis锁这类分布式锁机制抢占执行权,只有拿到锁的节点才继续执行任务,没拿到的直接跳过。不过这种方式需要自己处理锁的过期、异常释放等细节,稳定性不如Quartz原生的集群模式。
内容的提问来源于stack exchange,提问作者Kenez92
相关产品推荐
相关产品推荐

