【问题标题】:Spring task:scheduled or @Scheduler to restrict a Job to run in multiple instanceSpring task:scheduled 或 @Scheduler 限制作业在多个实例中运行
【发布时间】:2020-04-04 12:45:37
【问题描述】:
我有一个@Scheduler 作业,它在集群环境中的多台服务器上运行。但是,我想将作业限制为仅在一台服务器中运行,并且一旦任何其他服务器启动它,其他服务器不应运行相同的作业。
我已经使用一些数据库表探索了 Spring Batch 具有锁定机制,但仅在 spring task:scheduler 中寻找任何解决方案。
【问题讨论】:
标签:
spring
spring-boot
spring-batch
scheduled-tasks
quartz-scheduler
【解决方案1】:
我遇到了同样的问题,我实现的解决方案是带有 Hazelcast 的 Lock 机制,为了使其易于使用,我还为此添加了适当的注释和一些 spring AOP。因此,通过这个技巧,我能够通过单个注释在集群上强制执行单个调度。
【解决方案2】:
Spring Batch 有一个很好的功能,它不会使用相同的作业参数运行作业两次。
您可以使用此功能,以便当 Spring 批处理作业在另一台服务器中启动时它不会运行。
通常人们将时间戳作为参数传递,因此它会绕过此逻辑,您可以更改它。