這個需求是之前所需要的任務,當時想着使用框架來實現動態定時的,后來想想如果不用框架來實現是否應該可以;
嘗試着實現沒想到真的可以哈哈哈,現在就來記錄一下吧因為是很久之前的 這里就沒有參考鏈接了,q_q
先說下邏輯,業務需求是要能夠動態定時,可以支持單次的定時,也要支持連續定時任務;
先上下代碼:
public R addTimer(@RequestBody WeeklyReportSetting weeklyReportSetting, HttpServletRequest request) { WeeklyReportSettingExample example = new WeeklyReportSettingExample(); List<WeeklyReportSetting> weeklyReportSettingList = weeklyReportSettingMapper.selectByExample(example); if (isNotEmpty(weeklyReportSettingList)) { weeklyReportSetting.setSettingId(System.currentTimeMillis() + ""); Date date = new Date(); weeklyReportSetting.setSettingTime(date); weeklyReportSetting.setEmployeeName(SessionUtil.getUser(request).getName()); weeklyReportSetting.setEmailTemplate(null); weeklyReportSettingMapper.deleteByPrimaryKey(weeklyReportSettingList.get(0).getSettingId()); weeklyReportSettingMapper.insert(weeklyReportSetting); } else { weeklyReportSetting.setSettingId(System.currentTimeMillis() + ""); Date date = new Date(); weeklyReportSetting.setSettingTime(date); weeklyReportSetting.setEmailTemplate(null); weeklyReportSetting.setEmployeeName(SessionUtil.getUser(request).getName()); weeklyReportSettingMapper.insert(weeklyReportSetting); } if (future != null) { future.cancel(true); } //8 8 5 ? ? 2 //連續定時 if (weeklyReportSetting.getReportType() == 1) { String corn = ""; switch (weeklyReportSetting.getSendWeek()) { case 1: corn = "06 00 " + weeklyReportSetting.getSendTie() + " * * SUN"; break; case 2: corn = "06 00 " + weeklyReportSetting.getSendTie() + " * * MON"; break; case 3: corn = "06 00 " + weeklyReportSetting.getSendTie() + " * * TUES"; break; case 4: corn = "06 00 " + weeklyReportSetting.getSendTie() + " * * WED"; break; case 5: corn = "06 00 " + weeklyReportSetting.getSendTie() + " * * THUR"; break; case 6: corn = "06 00 " + weeklyReportSetting.getSendTie() + " * * FRI"; break; case 7: corn = "06 00 " + weeklyReportSetting.getSendTie() + " * * SAT"; break; } //開啟定時任務線程 future = threadPoolTaskScheduler.schedule(new MyRunnable(weeklyReportSetting), new CronTrigger(corn)); } else if (weeklyReportSetting.getReportType() == 2) { String time = weeklyReportSetting.getTimes(); String[] times = time.split("-"); String cron = "06 " + times[4] + " " + times[3] + " " + times[2] + " " + times[1] + " *"; future = threadPoolTaskScheduler.schedule(new MyRunnable(weeklyReportSetting), new CronTrigger(cron)); } return R.ok(); } private class MyRunnable implements Runnable { private WeeklyReportSetting weeklyReportSetting; public MyRunnable(WeeklyReportSetting weeklyReportSetting) { this.weeklyReportSetting = weeklyReportSetting; } @Override public void run() { //具體的邏輯代碼 } } }
代碼前半部分都是業務相關代碼可以忽略
if (future != null) { future.cancel(true); }
從這開始 首先判斷線程中有沒有過 要是有先取消之前設置定時任務,之后記錄新的
weeklyReportSetting.getSendTie()格式是兩位的字符串,case部分就是匹配用戶輸入的星期幾 某個時間點啟動任務;這個屬於連續定時
else 里面代碼是單次定時,某天的某時的任務啟動時間設置完成以后
threadPoolTaskScheduler.schedule(new MyRunnable(weeklyReportSetting), new CronTrigger(cron));
將設置信息放到線程中擇時啟動任務;