zoukankan      html  css  js  c++  java
  • java项目定时任务实现

    首先配置spring-context.xml文件

    在xmlns 下加如下代码

    xmlns:task="http://www.springframework.org/schema/task"

    在xsi:schemaLocation里添加如下代码

    http://www.springframework.org/schema/task 
    http://www.springframework.org/schema/task/spring-task-3.1.xsd

    还有任务扫描

    <task:annotation-driven />

    以上配置完成,新建java类写定时任务

    package com.test.job;
    
    import java.util.Date;
    
    import org.springframework.scheduling.annotation.Scheduled;
    import org.springframework.stereotype.Component;
    
    import lombok.extern.log4j.Log4j2;
    
    /**
     * 定时任务测试
     * @author ljl
     *
     */
    @Log4j2
    @Component
    public class TestJob {
        
        @Scheduled(cron = "0 */5 * * * ?")
        public void test1() {
            log.info("每5分钟执行一次"+ new Date());
        }
        
        @Scheduled(cron = "0 0 12 * * ?")
        private void test2() {
            log.info("每天中午12点执行"+ new Date());
        }
    
    }

    以上定时任务完成。

    思考:如果多台服务器部署同一个项目,就会出现一个定时任务多次执行的问题,如何解决?

    网上找了以下四种方法,可以作为参考。

    1、设置执行定时任务的机器名,在代码中判断,只让某一台机器执行。

    2、如果有可能,将定时任务独立出来,成为一个单独的项目工程,单一部署。

    3、将任务的定时触发模块、任务的执行模块分离。任务的定时触发模块每台机器都允许触发任务,但是任务的执行模块,只要收到一个执行任务,那么下一个执行任务就被忽略掉。任务开始执行设置running = true,任务执行完毕设置running = false,当running

    为ture时候,下一个任务不允许执行。需要注意的是,一定要在finally中加上running = false,要不然任务异常的话,下一次任务永远不会再执行了。
    4、在数据库建一个表:timerT,表里面有三个字段:status(表当前定时器是否处于可运行状态)、timestamp(时间戳)、serverIP(正在运行定时器的服务器IP)。当两台服务器,都运行起来后,服务器A开始执行定时器,这时,A会去读取表timerT的status字段,当为0时,则执行定时器的业务逻辑,此时A定时器,需要把status改为1,以便让另一台服务器的定时器B不去执行业务逻辑并把当前服务器的IP记录到表中,同时修改启动一个新的线程,在XXX长的时间间隔内不断去修改timestamp的值,当A执行完业务逻辑时,就把status的值改为0,这样B定时器就可以执行。这样做可以解决一个问题,就是:当其中一个定时器A挂掉后,我们另一个定时器B,可以比对timestap的值与当前时间是否超过XXX时长,如果超过,则证明定时器A已经挂掉,这时B就会把status的值改成1,把serverIP改成B定时器所在的服务器IP,并执行业务逻辑。
  • 相关阅读:
    理解内存对齐
    Nodejs koa2读取服务器图片返回给前端直接展示
    nodejs koa2 设置 静态资源目录
    把 nodejs koa2 制作的后台接口 部署到 腾讯云服务器
    nodejs 更改项目端口号的 方法
    简单实现 nodejs koa2 mysql 增删改查 制作接口
    java对象的序列化以及反序列化详解
    springboot对LocalDateTime类型入参和接口返回值格式化
    js 正则exec()函数在循环中使用
    centeros 7 忘记root密码,重置
  • 原文地址:https://www.cnblogs.com/lujiulong/p/7756061.html
Copyright © 2011-2022 走看看