springboot 定时任务问题

Posted 牧の风

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springboot 定时任务问题相关的知识,希望对你有一定的参考价值。

1.springboot 定时执行某个方法

2.springboot 通过接口生成 某个调度时间 定时执行

  方法1: 网上好多案例 不做详细阐述

  方法2:业务场景:用户配置一个活动,然后根据配置活动的时间定时推送消息。

    1.配置一个每天凌晨的定时任务,去数据库查询数据,将符合条件的 cron表达式放入定时任务中,依次执行,同时将结束时间是昨天的定时任务删除。

    2.如果新添加定时任务,需要在当天执行定时任务,需要手动调用定时任务启动方法,添加定时任务。

 

直接上代码:

 

@Autowired
    private ThreadPoolTaskScheduler threadPoolTaskScheduler;

    @Autowired
    RoomMembersService roomMembersService;

    @Autowired
    MongoTemplate mongoTemplate;

    private Map<String, ScheduledFuture<?>> taskMap = new HashMap<>();

    private ScheduledFuture<?> future;

    @Scheduled(cron = "0 0 0 * * ?")
    public void syncWxOnlineUsersAndGroupsMsg() {
        log.info("-------------> 凌晨调度开始");
        //获取所有符合条件的cron表达式,添加调度
        List<GroupSignIn> signInCronList = roomMembersService.getSignInCronList();
        log.info("-------------> "+signInCronList.size());
        for (GroupSignIn groupSignIn : signInCronList){
            String cron = groupSignIn.getReminder_cron();
            String sign_id = groupSignIn.get_id().toString();
            String material_content = groupSignIn.getMaterial_content();
            startCron(cron,sign_id,material_content);
        }
        //获取所有昨天结束的调度,删除任务
        List<GroupSignIn> executeOverList = roomMembersService.executeOver();
        if (null != executeOverList && executeOverList.size() >0){
            for (GroupSignIn groupSignIn : executeOverList){
                String sign_id = groupSignIn.get_id().toString();
                log.info("删除调度任务",sign_id);
                stop(sign_id);
            }
        }
        log.info("-------------> 凌晨调度结束");
    }


    @Bean
    public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
        return new ThreadPoolTaskScheduler();
    }

    public void startCron(String cron,String sign_id,String material_content) {
        log.info("-------------> 开始添加定时任务");
        String createTime = TimeUtils.getCurrentTimeInString(TimeUtils.DATETIME_FORMAT_DATE);
        ScheduledFuture<?> future = threadPoolTaskScheduler.schedule(new MyRunnable(cron,sign_id,material_content), new CronTrigger(cron));
//        stop(sign_id);
        taskMap.put(sign_id,future);
        SignInTask signInTask = new SignInTask();
        signInTask.setMaterial_content(material_content);
        signInTask.setSign_id(sign_id);
        signInTask.setReminder_cron(cron);
        signInTask.setCreated_date(createTime);
        mongoTemplate.insert(signInTask);
    }
    private class MyRunnable implements Runnable {
        private  String cron ;
        private  String sign_id ;
        private  String material_content ;
        public  MyRunnable(String cron,String sign_id,String material_content){
            this.cron = cron;
            this.sign_id = sign_id;
            this.material_content = material_content;
        }

        @Override
        public void run() {
            roomMembersService.sendSignMsg(sign_id,material_content);
        }
    }


    public boolean stop(String name) {
        log.info("-------------> 删除调度开始"+name);
        if(null == taskMap.get(name)) {
            return false;
        }
        ScheduledFuture<?> scheduledFuture = taskMap.get(name);
        scheduledFuture.cancel(true);
        taskMap.remove(name);
        return true;
    }

 

  因为本人对 多线程 了解的少,所以还需要优化 如何异步跑调度。

对自己---》需要看定时任务源码,详细理解为什么 这样做,如何优化

 

以上是关于springboot 定时任务问题的主要内容,如果未能解决你的问题,请参考以下文章

jeesite 定时任务 或者springboot 执行定时任务

springboot项目使用SchedulingConfigurer实现多个定时任务

springboot项目使用SchedulingConfigurer实现多个定时任务

#yyds干货盘点# springboot整合Elastic Job实现分片配置定时任务

SpringBoot定时任务

Springboot 内置定时器的使用