java - 一个项目在集群中运行,如何让定时任务只运行一次?
黄舟
黄舟 2017-04-18 10:32:05
0
8
1100

一个项目在集群中运行,如何让定时任务只运行一次?不加限制就会导致重复计算的问题。

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回复(8)
洪涛

java的话,建议使用quartz,
1.quartz做各类定时任务很方便
2.它是支持集群的,原理是通过数据库表来保证同一个任务只在一个服务上执行。

左手右手慢动作

假设你最简单的方式使用quartz,那么你在代码中就要修改了,在job逻辑中加入获取锁的操作,这个锁可以做到数据库,具体方法是:插入一条有业务意义主键记录,执行时,集群中相同的job只会有一条插入成功,这就代表它获得了锁,可以执行,否则退出此次job,不执行。

Ty80

Configure Clustering with JDBC-JobStore

Quartz’s clustering features bring both high availability and scalability to your scheduler via fail-over and load balancing functionality.

quartz 本身就是支持集群,容错,负载均衡的。不需要改任何代码即可实现。

巴扎黑

quartz框架支持集群

左手右手慢动作

可以做一个中间件系统,专门管理定时任务的触发和消息的订阅和消费,到了时间触发时就发一个消息出来,由集群系统来订阅这条消息。消息可以随机投递到集群中任何任何一台机器。

左手右手慢动作

一台机器定时开始就要通过消息广播给其它机器。但每台机器时间间隔是个问题,没等消息发呢就都定时开启了...

阿神
  1. 使用zookeeper,redis等手动存储定时任务执行状态等信息,保证只执行一次。

  2. 将定时任务抽取到一个单独的项目中(单机运行),但是任务具体内容通过远程调用(dubbo,mq等)调用具体的分布式服务。也就是定时任务只是单独的用于任务触发,具体任务还是分布式执行的。

  3. 使用各种分布任务调度系统,如Uncode-Schedule

Ty80

倾向于单独拉出来弄个stand-alone的程序

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板