集群和分布式的处理方式都是一样的,就是要告诉quartz每个服务都有不同的标识,这样我们的任务会负载均衡到每个服务上去执行。
我们的需求是这样:
一个程序集群部署到两个服务上,两个服务共用一个quartz库,但是我们的一个任务只希望在一个服务上运行,有多个任务的话,会负载均衡到每个服务去执行。
集群1:
server: port: 8080 spring: quartz: properties: org.quartz.threadPool.threadCount: 4 org.quartz.scheduler.instanceName: Orderservice org.quartz.scheduler.instanceId: Order_1 org.quartz.jobStore.isClustered: true
集群2:
server: port: 8081 spring: quartz: properties: org.quartz.scheduler.instanceName: Orderservice org.quartz.scheduler.instanceId: Order_2 org.quartz.jobStore.isClustered: true
Orderservice表示多个集群都是一个quartz服务名
Order_1 Order_2代表多个实例名
org.quartz.jobStore.isClustered: true这个一定要配置成true
在分布式环境下:
org.quartz.scheduler.instanceName
org.quartz.scheduler.instanceId都不一样
---------------注意点---------------
spring.quartz.jdbc.initialize-schema: xxx
集群部署的话,这个参数要是always的话是不行的,因为每个服务重启都要清空数据再插入,所以第一台服务用always 后面的用Nerver 这样比较麻烦,再看看有么有好的办法
我们在spring环境下结合quartz有3种方式,前两种方式是启动服务的时候持久化到数据库,那么集群模式下,每个都去持久化会导致问题,所以当时推荐用第3种方式也是这个原因
原文:https://www.cnblogs.com/johnzhao/p/14426005.html