添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
有腹肌的电影票  ·  python ...·  1 年前    · 

来源:blog.csdn.net/chenping1993/article/

details/108274814

业务场景描述:定时任务的任务名称,cron(定时任务表达式),定时任务开关,存储在数据库表中。在不重启项目的情况下,修改定时任务表达式,可以实时获取新的定时任务执行时间规则;修改定时任务执行状态,可以随时开关定时任务。

使用技术:基于接口  SchedulingConfigurer

1、建表 管理定时任务

DROP TABLE IF EXISTS `scheduled`;
CREATE TABLE `scheduled` (
  `name` varchar(20) DEFAULT NULL,
  `cron` varchar(30) DEFAULT NULL,
  `open` tinyint(1) DEFAULT NULL COMMENT '1开启, 其他为关闭'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of scheduled
-- ----------------------------
INSERT INTO `scheduled` VALUES ('demo1', '0/5 * * * * ?', '1');
INSERT INTO `scheduled` VALUES ('demo2', '0/6 * * * * ?', '1');

2、代码实现

定时任务配置类:

package com.example.demo.scheduled;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
 * @Description: 基于接口SchedulingConfigurer的动态定时任务
 * @Author: 
@Configuration
@EnableScheduling
public abstract class ConfigurerSchedulingDemo implements SchedulingConfigurer {
    //定时任务周期表达式
    private String cron;
     * @Description:  重写配置定时任务的方法
     * @param: scheduledTaskRegistrar 
     * @return: void 
     * @Author: 
    @Override
    public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
        scheduledTaskRegistrar.setScheduler(taskScheduler());
        scheduledTaskRegistrar.addTriggerTask(
                //执行定时任务
                    taskService();
                //设置触发器
                triggerContext -> {
                   cron = getCron();//获取定时任务周期表达式
                    CronTrigger trigger = new CronTrigger(cron);
                    return trigger.nextExecutionTime(triggerContext);
    @Bean
    public Executor taskScheduler() {
        //设置线程名称
        ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("demo-pool-%d").build();
        //创建线程池
        return Executors.newScheduledThreadPool(5, namedThreadFactory);
     * @Description: 执行定时任务
     * @param:
     * @return: void
     * @Author: 
    public abstract void taskService();
     * @Description: 获取定时任务周期表达式
     * @param:
     * @return: java.lang.String
     * @Author: 
     * @Date: 2020/8/28
    public abstract String getCron();
 

定时任务1

package com.example.demo.scheduled;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.demo.dao.CronMapper;
import com.example.demo.entity.Scheduled;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import java.time.LocalDateTime;
 * @Description:
 * @Author: 
@Configuration
public class TaskDemo extends ConfigurerSchedulingDemo {
    @Autowired      //注入mapper
    @SuppressWarnings("all")
    CronMapper cronMapper;
    @Override
    public void taskService() {
        Integer open = getOpen();
        if (1== open){
            System.out.println("定时任务demo1:"
                    + LocalDateTime.now()+",线程名称:"+Thread.currentThread().getName()
                    + " 线程id:"+Thread.currentThread().getId());
    @Override
    public String getCron() {
        QueryWrapper<Scheduled> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("name","demo1");
        String cron = cronMapper.selectOne(queryWrapper).getCron();
        return cron;
    public Integer getOpen() {
        QueryWrapper<Scheduled> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("name", "demo1");
        Integer open = cronMapper.selectOne(queryWrapper).getOpen();
        return open;
 

定时任务2

package com.example.demo.scheduled;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.demo.dao.CronMapper;
import com.example.demo.entity.Scheduled;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import java.time.LocalDateTime;
 * @Description:
 * @Author: 
@Configuration
public class TaskDemo1 extends ConfigurerSchedulingDemo {
    @Autowired      //注入mapper
    @SuppressWarnings("all")
    CronMapper cronMapper;
    @Override
    public void taskService() {
        Integer open = getOpen();
        if (1== open){
            System.out.println("定时任务demo2:"
                    + LocalDateTime.now()+",线程名称:"+Thread.currentThread().getName()
                    + " 线程id:"+Thread.currentThread().getId());
    @Override
    public String getCron() {
        QueryWrapper<Scheduled> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("name","demo2");
        String cron = cronMapper.selectOne(queryWrapper).getCron();
        return cron;
    public Integer getOpen() {
        QueryWrapper<Scheduled> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("name", "demo2");
        Integer open = cronMapper.selectOne(queryWrapper).getOpen();
        return open;
 

效果展示:

启动项目:控制台输出展示

修改数据库 demo1的执行时间为每15秒一次:

关闭demo1的定时任务,将demo1的open状态改为0:

主流Java进阶技术(学习资料分享)

PS:因为公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。点“在看”支持我们吧!

点击关注公众号,实用技术文章及时了解来源:blog.csdn.net/chenping1993/article/details/108274814业务场景描述:定时任务的任务名称,cron...
业务场景描述: 定时任务的任务名称,cron(定时任务表达式),定时任务开关,存储在数据库表中。在不重启项目的情况下,修改定时任务表达式,可以实时获取新的定时任务执行时间规则;修改定时任务执行状态,可以随时开关定时任务。 使用技术:基于接口 SchedulingConfigurer 1、建表 管理定时任务 DROP TABLE IF EXISTS `scheduled`; CREATE TABLE `scheduled` ( `name` varchar(20) DEFAULT NULL, public class SftpScheduler implements SchedulingConfigurer { @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { logger.info("
实现SchedulingConfigurer接口,并且重写configureTasks方法。 package cn.tongdun.spartan.biz.support.impl; import cn.tongdun.spartan.biz.support.service.DockCustomerService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factor
之前在做oa项目的钉钉推送功能的时候,组长让我增加一个定时推送的功能,最好能实现用户在前端能自由修改时间。但是网上查了发现很多方法都需要重启项目实现,后来从一篇博客上翻到说可以换一种思路,并不是去修改定时器时间,可以通过将之前的定时器停止注销,然后重新开启一个新的定时器来实现。 先上代码吧,基本上除了去掉了部分注入和方法参数的处理过程,整体逻辑都还是在的 * 钉钉消息推送定时器C...
private ThreadPoolTaskScheduler threadPoolTaskScheduler; private ScheduledFuture<?> future; @Bean public ThreadPoolTaskScheduler threadPoolTaskScheduler() { retur CREATE TABLE `scheduled_task` ( `id` int(11) NOT NULL AUTO_INCREMENT, `task_key` varchar(128) NOT NULL COMMENT '任务key值(使用bean名称)', `task_desc` varchar(128) DEFAULT NULL COMMENT '...