動態設置定時任務-線程實現


這個需求是之前所需要的任務,當時想着使用框架來實現動態定時的,后來想想如果不用框架來實現是否應該可以;

嘗試着實現沒想到真的可以哈哈哈,現在就來記錄一下吧因為是很久之前的 這里就沒有參考鏈接了,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));
將設置信息放到線程中擇時啟動任務;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM