用户自定义实现定时任务?很简单我教你实现!
生活随笔
收集整理的這篇文章主要介紹了
用户自定义实现定时任务?很简单我教你实现!
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
需求背景:項目是公司內自己人用的項目,有一個類似于鬧鐘的提醒的功能,提醒集成的是友盟推送,定時任務進行請求推送這個提醒;實現個人自定義定時任務。
Service public class CronServiceImpl implements CronService {private Logger log = LoggerFactory.getLogger(getClass());******//ScheduledInfoMapper 是我自己的業務代碼,一定確保實體類中的id唯一 有cron表達 式 別的什么東西看你自己業務 有這兩個就可以啟動定時任務,一下所有這個mapper查出來的都此道理********** @Autowiredprivate ScheduledInfoMapper scheduledInfoMapper;@Autowiredprivate ThreadPoolTaskScheduler threadPoolTaskScheduler;private Map<String, ScheduledFuture<?>> futureMap = new HashMap<>();!!!!!!!!!!!!!!!!!!!!scheduledInfoModel = 你的需要處理的實體類或者僅僅是為了開這個定時任務的參數!!!!!!!!!!!!!!!!!!@Beanpublic ThreadPoolTaskScheduler threadPoolTaskScheduler() {return new ThreadPoolTaskScheduler();}public void startCron(String id) {log.info("定時任務 startCron 方法");//這個是校驗定時任務池子里有咩有相同id正在跑的定時任務。if (!futureMap.containsKey(id)) {//查詢我自己數據庫中需要推送的詳細信息 ScheduledInfoModel scheduledInfoModel = scheduledInfoMapper.selectById(id);if (scheduledInfoModel != null){//這一段是啟動定時任務的關鍵代碼ScheduledFuture<?> future = threadPoolTaskScheduler.schedule(new MyRunnable(scheduledInfoModel), new CronTrigger(scheduledInfoModel.getCron()));futureMap.put(scheduledInfoModel.getId(), future);//------------此處可以做自己的業務 比如更新數據庫記錄此條消息已經進行定時任務---------log.info("啟動定時任務成功,任務id:{},推送人id:{},任務提醒時刻:{}",scheduledInfoModel.getId(),scheduledInfoModel.getAuthId(),scheduledInfoModel.getContent());}else {log.warn("已經存在重復任務,任務id:{},任務標題:{},任務提醒時刻:{}",scheduledInfoModel.getId(),scheduledInfoModel.getAuthId(),scheduledInfoModel.getContent());return;}}}@Overridepublic void stopCron(String id) {log.info("定時任務 stopCron 方法");ScheduledInfoModel scheduledInfoModel = scheduledInfoMapper.selectById(id);ScheduledFuture<?> future = futureMap.get(id);if (future != null) {future.cancel(true);futureMap.remove(id);log.info("關閉定時任務成功,任務id:{},任務標題:{},任務提醒時刻:{}",scheduledInfoModel.getId(), scheduledInfoModel.getAuthId(), scheduledInfoModel.getContent());}}@Overridepublic void changeCron(String id) {log.info("定時任務 changeCron 方法");stopCron(id);// 先停止,在開啟.startCron(id);}private class MyRunnable implements Runnable {//我自己的東西private ScheduledInfoModel scheduledInfoModel;public MyRunnable(ScheduledInfoModel scheduledInfoModel) {this.scheduledInfoModel = scheduledInfoModel;}@Overridepublic void run() {//--------------------自己業務處理}}}然后到這里就完了?不! 你是不是還在發愁cron表達式怎么生成? 不慌看下邊
ublic class TransPortUtil {public static Cron trans(傳入你的實體類){實體類中需要包含的東西必要的就是 week字段 和 時間節點week字段:比如周一,周二,周三,周四1,2,3,4 這種類型的字符串就行時間節點字段 就是正常的 YYYYMMDD HHmmss 類型的我們只截HHmmss 這一段還有很多年月日各種cron生成的辦法可在csdn百度SimpleDateFormat shi = new SimpleDateFormat("HH");SimpleDateFormat fen = new SimpleDateFormat("mm");SimpleDateFormat miao = new SimpleDateFormat("ss");String hour = shi.format(time);String minutes = fen.format(time);String seconds = miao.format(time);String cron = CronUtil.getCron(week, hour, minutes, seconds);//cron生成完成//加以改造返回你的實體類return Cron;} }到此結束,主要就是利用定時任務線程池進行線程的開啟修改和關閉
但是一定要了解到就是一個定時任務就是一個線程,java大概可以同時跑1000個線程左右,如果跑滿的話回宕機的哦。
文章持續更新,有問題可以留言。
總結
以上是生活随笔為你收集整理的用户自定义实现定时任务?很简单我教你实现!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用WIFI模块与阿里云物联网套件进行透
- 下一篇: 面试题--promise和setTime