专栏首页令仔很忙令仔学多线程系列(三)----每天定点执行指定任务

令仔学多线程系列(三)----每天定点执行指定任务

/**
 * 定点去发起重搜类-21点
 * Created by ling.zhang on 2017/3/1.
 */
@Component
public class AirChangeTimerManage extends TimerTask {
    private static final Logger logger= LoggerFactory.getLogger(AirChangeTimerManage.class);

    @Autowired
    PolicyRedisManage redisManage;


    //时间间隔  ms
    private static final long PERIOD_DAY = 24 * 60 * 60 * 1000;

    public AirChangeOrderLoadManage(){
        Calendar calendar=Calendar.getInstance();

        /*** 定制每日4:00执行方法 ***/
        calendar.set(Calendar.HOUR_OF_DAY,4);
        calendar.set(Calendar.MINUTE,00);
        calendar.set(Calendar.SECOND,00);

        Date date=calendar.getTime();  //第一次执行定时任务的时间

        //如果第一次执行定时任务的时间  小于 当前时间
        //此时要在第一次执行定时任务的时间加一天,以便次任务在下个时间点执行,如果不加一天,任务会立即执行。
        if (date.before(new Date())){
            date=this.addDay(date,1);
        }

        Timer timer=new Timer();
        //安排指定的任务在指定的时间开始进行重复的固定延迟执行。
        timer.schedule(this,date,PERIOD_DAY);
    }

    // 增加或减少天数
    public Date addDay(Date date, int num) {
        Calendar startDT = Calendar.getInstance();
        startDT.setTime(date);
        startDT.add(Calendar.DAY_OF_MONTH, num);
        return startDT.getTime();

    }



    @Override
    public void run(){
        try{
            //相关任务
        }catch (Exception e){
            logger.error("airchange timer error {}",e);
        }
    }
}

需要注意的一个地方,就是在AirChangeTimerManage 类中,我是每天4点定时执行任务,但是如果我在4点之后进行了重启或者发布,启动之后这个任务就会立即启动执行,这样并不是我想要的,为了,避免这种情况发生,只能判断一下,如果发布或重启服务的时间晚于定时执行任务的时间,就在此基础上加一天。

扩展

上面的这种方式还是有些局限的,如果有多个定时任务,那每个类中都要加这些代码。因为我在这用的是this。只执行当前类。

timer.schedule(this,date,PERIOD_DAY);

所以这样还是有些坑的,当然这也得看具体的情况。可以是这样的

Timer timer = new Timer();
24

25
  AirChangeTimerManage task = new AirChangeTimerManage();
26
  //安排指定的任务在指定的时间开始进行重复的固定延迟执行。
27
  timer.schedule(task,date,PERIOD_DAY);

但是在AirChangeTimerManage类里面,有下面这些代码:

 @Value("${airchangeopen}")
    String airChangeOpen;

    @Autowired
    OTAOrderFlightInfoDao flightInfoDao;

    @Autowired
    ReportDetailDao reportDetailDao;

    @Autowired
    PolicyRedisManage redisManage;

如果用new的话,这些会启动不起来的。当然如果你的任务中如果只涉及到了一些计算之类的,完全可以用另外new的方式。扩展性挺好的。就是配置一个监听器来监听定时任务。

public class AirChangeTimerManage extends TimerTask {
 private static Logger log = Logger.getLogger(NFDFlightDataTimerTask.class);

 @Override
 public void run() {
  try {
   //在这里写你要执行的内容
  } catch (Exception e) {
   log.info("-------------解析信息发生异常--------------");
  }
 }
}

public class AirChangeListener implements ServletContextListener {

 public void contextInitialized(ServletContextEvent event) {
  new AirChangeTimerManage();
 }

 public void contextDestroyed(ServletContextEvent event) {
 }
}

然后再web.xml中配置监听器

<listener>

 <listener-class>

  com.listener.NFDFlightDataTaskListener

 </listener-class>

</listener>

这样的话,多个定时任务就不会出现那么多的重复代码了。 如果有什么不足之处,还望各位同志们多多指正。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • CountDownLatch、CyclicBarrier让线程听我号令

    在多线程协作完成任务的时候,有时候需要等待其他线程完成任务后,主线程才能继续执行,我们可以使用 Thread 类的 join() 方法,让主线程等待被 join...

    码哥字节
  • 手把手教你在centos上配置Django项目(超详细步骤)

    关于Django的部署,本人也踩了很多坑,这篇文章一步一步教你怎么进行部署,只需要你按照我的步骤来就OK了!这里我们使用的服务器是一个全新的服务器,没有安装任何...

    Python进击者
  • SSH框架(三) spring 定时器

    SSH框架(三) spring 定时器

    Java架构师必看
  • 看完这篇还不懂高并发中的线程与线程池你来打我(内含20张图)

    你可能会有疑问,讲多线程为什么要从CPU说起呢?原因很简单,在这里没有那些时髦的概念,你可以更加清晰的看清问题的本质。

    范蠡
  • 从根上理解高性能、高并发(一):深入计算机底层,理解线程与线程池

    本文原题“聊聊TCP连接耗时的那些事儿”,本次收录已征得作者同意,转载请联系作者。有少许改动。

    JackJiang
  • 20 张图读懂高并发中的线程与线程池

    你可能会有疑问,讲多线程为什么要从CPU说起呢?原因很简单,在这里没有那些时髦的概念,你可以更加清晰的看清问题的本质。

    一个优秀的废人
  • 【云+社区年度征文】PySimpleGUI一个建立在tkinter之上更简单但功能强大的GUI

    你将会学会一个除了Pyqt5、TK等其它界面编程的Python第三方库,你可以利用它更方便的做出交互的界面。

    王荣胜
  • 计算机是如何跑起来的?

    瞬间,鸦雀无声甚至气氛一度及其尴尬。作为一个CURD男孩,写代码就是一把梭复制粘贴,那能管那么宽?仔细一想,我也是学过计算机组成原理、操作系统原理的男孩,岂能说...

    帅地
  • 【深度】函数运行时在内存中是什么样子?

    2. 我们在上一篇文章《高性能高并发服务器是如何实现的》中提到了一项关键技术——协程,你知道协程的本质是什么吗?有的同学可能会说是用户态线程,那么什么是用户态线...

    GorgonMeducer 傻孩子
  • 配对交易千千万,强化学习最NB!(附文档+代码讲解)

    本推文会介绍如何在利用股票分钟数据,基于强化学习来做配对交易。包括基本概念和具体实现;这里采用的强化学习方法,是类似多臂老虎机(N-armed bandit)问...

    量化投资与机器学习微信公众号
  • Linux中的邮件功能mailx

    这两天有个临时的任务,某个游戏的开发人员需要定时提取一个表里面的数据,用来做一些统计分析的处理。由于线上的权限控制的比较严格,所以需要DBA在每天早上的1...

    AsiaYe
  • 一文精通 crontab 从入门到出坑

    此篇技术博文主要介绍的是crontab,Linux下的计划任务管理工具。涉及内容包括crontab使用配置、常见坑的分析和编者总结的错误调试方法。

    波罗学
  • 一文精通 crontab 从入门到出坑

    此篇技术博文主要介绍的是crontab,Linux下的计划任务管理工具。涉及内容包括crontab使用配置、常见坑的分析和编者总结的错误调试方法。

    波罗学
  • 面试官:线程池如何按照core、max、queue的执行循序去执行?(内附详细解析)

    前几天一个朋友在群里分享了他刚刚面试候选者时问的问题:"线程池如何按照core、max、queue的执行循序去执行?"。

    一枝花算不算浪漫
  • 50年前的登月程序和程序员有多硬核

    2019年7月20日,是有纪念意义的一天,这天不是因为广大网民帮周杰伦在新浪微博上的超话刷到第一,而是阿波罗登月的50周年的纪念日。早在几年前,在Github上...

    Linux阅码场
  • 50 年前的登月程序和程序员有多硬核

    来源:https://coolshell.cn/articles/19612.html

    芋道源码
  • Android 面试题:Handler、自定义View、Java三大特性、分发机制、动画(第1期)

    为了帮助大家养成好习惯,码仔们自发在社群里提出了每日一问!每天一道面试题!然后收录大家的答案整合到一起,方便大家的学习和复习。

    陈宇明
  • 几个经典战棋游戏分析

    战棋类玩法的分析维度 战棋类游戏源远流长,从最早的“龙与地下城”一类桌面游戏,到家用游戏机、PC端游、各种次世代主机,甚至后来风靡一时的页游《傲世三国》、《神仙...

    韩伟
  • MySQL 定时备份数据库(非常全),值得收藏!

    在操作数据过程中,可能会导致数据错误,甚至数据库奔溃,而有效的定时备份能很好地保护数据库。本篇文章主要讲述了几种方法进行 MySQL 定时备份数据库。

    JAVA葵花宝典

扫码关注云+社区

领取腾讯云代金券