• 动态设置定时任务-线程实现


    这个需求是之前所需要的任务,当时想着使用框架来实现动态定时的,后来想想如果不用框架来实现是否应该可以;

    尝试着实现没想到真的可以哈哈哈,现在就来记录一下吧因为是很久之前的 这里就没有参考链接了,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));
    将设置信息放到线程中择时启动任务;
  • 相关阅读:
    AngularJs $location 和 $window
    AngularJS——自定义服务详解(factory、service、provider)
    angularAMD+requireJs
    angular ui-router时要使用html5Mode=true
    CSS3的calc()使用
    React Ajax this.IsMounted() is not a function
    css有用的代码片段
    8908
    454
    234
  • 原文地址:https://www.cnblogs.com/blackCatFish/p/13140717.html
Copyright © 2020-2023  润新知