搜索

首页  >  问答  >  正文

java - 一个项目在集群中运行,如何让定时任务只运行一次?

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

黄舟黄舟2882 天前1135

全部回复(8)我来回复

  • PHP中文网

    PHP中文网2017-04-18 10:34:05

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

    回复
    0
  • ringa_lee

    ringa_lee2017-04-18 10:34:05

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

    回复
    0
  • PHP中文网

    PHP中文网2017-04-18 10:34:05

    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 本身就是支持集群,容错,负载均衡的。不需要改任何代码即可实现。

    回复
    0
  • 巴扎黑

    巴扎黑2017-04-18 10:34:05

    quartz框架支持集群

    回复
    0
  • ringa_lee

    ringa_lee2017-04-18 10:34:05

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

    回复
    0
  • ringa_lee

    ringa_lee2017-04-18 10:34:05

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

    回复
    0
  • 阿神

    阿神2017-04-18 10:34:05

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

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

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

    回复
    0
  • PHP中文网

    PHP中文网2017-04-18 10:34:05

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

    回复
    0
  • 取消回复