学习
实践
活动
专区
工具
TVP
写文章
专栏首页令仔很忙令仔学多线程系列(三)----每天定点执行指定任务

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

/**
 * 定点去发起重搜类-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>

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

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!
本文分享自作者个人站点/博客:https://blog.csdn.net/zlts000复制
如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • CountDownLatch、CyclicBarrier让线程听我号令

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

    码哥字节
  • 三分钟学 Go 语言——开始

    我已经习惯了每天抽 30 分钟在 github 上打卡,连着更新完了整个 go 语言系列的学习过程,当然了我会一直维护这个项目到天荒地老,后面我学到新知识或者看...

    机智的程序员小熊
  • 化繁为简,简括浏览器渲染机制

    我们都知道,JS是单线程的,也就是只有前一个任务执行完成,才会执行下一个任务。如果前一个任务耗时很长,那么下一个任务就只能干等着。显然,这样是非常浪费资源的。那...

    JowayYoung
  • 解决打开IDEA 对 CPU占用率巨大的问题

    点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 |...

    芋道源码
  • 第十四章 进程管理

    之前我们只是介绍了进程管理的几个基本命令,但关于进程的具体管理细节,我们将在本章详细介绍。

    晓天
  • SpringBoot实现定时任务的三种方式,总有一款适合你!

    点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 |...

    芋道源码
  • Quartz入门以及相关表达式使用[通俗易懂]

    RAMJobStore(内存作业存储类型)和JDBCJobStore(数据库作业存储类型),两种方式对比如下:

    全栈程序员站长
  • 【重磅】腾讯云积分体系正式上线

    五一假期刚过,小编在这里给大家带来一个震撼人心的好消息:经过了长久的策划、调试、内测、公测,腾讯云积分体系现已正式上线啦!

    腾讯云积分商城
  • Android多线程:AsyncTask使用教程(含实例讲解)

    Carson.Ho
  • 《多线程并发任务处理组件》——无声

    静默任务处理器组件可以赋予你的应用一键式多线程处理任务的能力, 它基于jdk1.8中concurrent包内容进行封装简化, 无任何第三方代码, 它提供了更简...

    星尘的一个朋友
  • 奈学:Executor框架的概述

    JDK1.5之前,我们如果想要使用Java线程来完成相关任务,一般涉及两个类,一个是Thread类,一个Thread对象在启动(start)之后会创建一个关联的...

    江帅帅
  • 伯克利弹跳机器人再进化:超精准着陆,指哪打哪

    机器人名叫Salto-1P,来自加州伯克利,曾经被IEEE Spectrum热烈地称赞为“最不可思议的弹跳机器人”。

    量子位
  • 面试官:你确定 Redis 是单线程的进程吗?

    上周发了一篇:3 万字 + 40 张图 | 突击 40 道 Redis 常见面试题 ,由于文章很长,可能有的小伙伴很难吸收,所以决定拆开分开发,这样大家每天学几...

    小林coding
  • Spring Boot 实现定时任务的 4 种方式

    Timer:这是java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程序按照某...

    Java技术栈
  • Attention is All You Need?LSTM提出者:我看未必

    深度学习先驱、图灵奖获得者 Yann LeCun 一直认为无监督学习才是通向真正人工智能的方向。为了实现无监督学习,我们需要探索基于能量的学习(energy-b...

    机器之心
  • Attention is All You Need?LSTM提出者:我看未必

    深度学习先驱、图灵奖获得者 Yann LeCun 一直认为无监督学习才是通向真正人工智能的方向。为了实现无监督学习,我们需要探索基于能量的学习(energy-b...

    小白学视觉
  • 2019 Java 高并发学习路线图

    有这些困惑很正常,因为并发编程是Java语言中最为晦涩的知识点,它涉及操作系统、内存、CPU、编程语言等多方面的基础能力,而这些知识点看上去非常的零散、独立,可...

    用户1655470
  • 怎么把Python当偷懒神器用?

    在日常工作中,我们常常会用到需要周期性执行的任务,一种方式是采用 Linux 系统自带的 crond[1] 结合命令行实现。另外一种方式是直接使用 Python...

    程序员皮克
  • spring的定时任务,超级简单好用

    @EnableScheduling 注解的作用是发现注解@Scheduled的任务并后台执行。@Scheduled用于标注这个方法是一个定时任务的方法cro...

    Java深度编程

扫码关注腾讯云开发者

领取腾讯云代金券