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

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: /** * 定点去发起重搜类-21点 * Created by ling.zhang on 2017/3/1. */@Componentpublic class AirChangeTimerManage exte...

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

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

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
2月前
|
算法 调度 索引
什么是多任务和线程?用线程写的一个udp同步聊天器
什么是多任务和线程?用线程写的一个udp同步聊天器
30 0
|
2月前
|
数据采集 存储 Java
「多线程大杀器」Python并发编程利器:ThreadPoolExecutor,让你一次性轻松开启多个线程,秒杀大量任务!
「多线程大杀器」Python并发编程利器:ThreadPoolExecutor,让你一次性轻松开启多个线程,秒杀大量任务!
|
8月前
|
程序员 开发者 Windows
多线程多任务是程序开发者与用户都需要的中资产
多线程多任务是程序开发者与用户都需要的中资产
34 0
|
8月前
|
调度 Python
Python多任务之多线程开发 2
Python多任务之多线程开发
47 0
|
2月前
|
存储 算法 Java
【C/C++ 线程池设计思路】 深入探索线程池设计:任务历史记录的高效管理策略
【C/C++ 线程池设计思路】 深入探索线程池设计:任务历史记录的高效管理策略
87 0
|
9天前
|
存储 安全 Java
Java多线程实战-从零手搓一个简易线程池(一)定义任务等待队列
Java多线程实战-从零手搓一个简易线程池(一)定义任务等待队列
|
29天前
|
Java Spring
定时任务里面的任务多线程操作
该内容是关于Spring Boot中配置异步任务和定时任务的代码示例。首先通过`@Configuration`和`@EnableAsync`开启异步支持,然后定义线程池,如使用`ThreadPoolExecutor`并设置核心线程数、最大线程数等参数。接着,在需要异步执行的方法上添加`@Async`注解。此外,通过`@EnableScheduling`开启定时任务,并使用`@Scheduled`定义具体任务和执行周期。若需指定多个线程池,可以创建不同的`Executor` bean,并在`@Async`中指定线程池名称。
19 2
|
2月前
|
安全 Java 调度
【C/C++ 线程池设计思路 】设计与实现支持优先级任务的C++线程池 简要介绍
【C/C++ 线程池设计思路 】设计与实现支持优先级任务的C++线程池 简要介绍
49 2
|
2月前
|
Java
多线程------Future异步任务
多线程------Future异步任务
|
2月前
|
Python
在Python中,如何使用多线程或多进程来实现任务的并行执行?
在Python中,如何使用多线程或多进程来实现任务的并行执行?
145 1

相关实验场景

更多