本文共 2721 字,大约阅读时间需要 9 分钟。
/** * 定点去发起重搜类-21点 * Created by ling.zhang on 2017/3/1. */@Componentpublic 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();2425 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中配置监听器
com.listener.NFDFlightDataTaskListener
这样的话,多个定时任务就不会出现那么多的重复代码了。
如果有什么不足之处,还望各位同志们多多指正。转载地址:http://wlpxl.baihongyu.com/