SpringBoot 动态定时任务

既然是动态就必须牵扯到数据库

-- ----------------------------
-- Table structure for scheduled_task
-- ----------------------------
DROP TABLE IF EXISTS `scheduled_task`;
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 '任务描述',
  `task_cron` varchar(128) NOT NULL COMMENT '任务表达式',
  `init_start_flag` int(2) NOT NULL DEFAULT '1' COMMENT '程序初始化是否启动 1 是 0 否',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uniqu_task_key` (`task_key`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of scheduled_task
-- ----------------------------
INSERT INTO `scheduled_task` VALUES ('1', 'scheduledTask01', '定时任务01', '0/5 * * * * ?', '1', '2019-11-22 09:40:56', '2019-11-22 14:27:15');
INSERT INTO `scheduled_task` VALUES ('2', 'scheduledTask02', '定时任务02', '0/2 * * * * ?', '0', '2019-11-22 09:40:58', '2019-11-22 15:33:49');

创建spring Boot项目 基本的依赖就OK 

比如(spring-boot-starter-web/spring-boot-starter-parent)

我用的是springBoot 2.2.1 +mybatis-plus+druid 数据库访问层根据你们自己比较熟悉的框架引用依赖就好

        
    <!-- 设置我们项目的一些版本属性 -->
    <properties>
        <java.version>1.8</java.version>
        <mybatis-puls.version>3.2.0</mybatis-puls.version>
        <mysql.version>5.1.31</mysql.version>
    </properties>

<!-- mysql驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
        </dependency>
       <!-- 配置阿里druid连接池,通过改变spring.datasource.type设置数据源 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>${mybatis-puls.version}</version>
        </dependency>

 

接下来配置你们的数据源 ,我用的多数据源就懒得贴出来了,就按你们最基本的配置能访问数据库就成哈哈哈哈哈!

 

好了正式开始了

1.首先要创建任务javaBean


@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class ScheduledTask implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 任务key值(使用bean名称)
     */
    private String taskKey;

    /**
     * 任务描述
     */
    private String taskDesc;

    /**
     * 任务表达式
     */
    private String taskCron;

    /**
     * 程序初始化是否启动 1 是 0 否
     */
    private Integer initStartFlag;

    /**
     * 创建时间
     */
    private Date createTime;

    /**
     * 更新时间
     */
    private Date updateTime;

    /**
     * 当前是否启动
     */
    private  boolean startFlag;
}

 

2.创建你们的mapper

我没有使用BaseMapper ,你们想怎么写就怎么写  ,只要有以下几个方法的效果就行

public interface ScheduledTaskMapper extends BaseMapper<ScheduledTask> {

    /**
     * 根据key 获取 任务信息
     */
    @Select("select task_key as taskKey,task_desc as taskDesc,task_cron as taskCron,init_start_flag as initStartFlag  from scheduled_task where task_key = '${taskKey}' ")
    ScheduledTask getByKey(@Param("taskKey") String taskKey);

    /**
     * 获取程序初始化需要自启的任务信息
     */
    @Select("select task_key as taskKey,task_desc as taskDesc,task_cron as taskCron,init_start_flag as initStartFlag from 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SpringBoot提供了一个非常方便的方式来实现动态定时任务。具体实现步骤如下: 1. 首先需要在pom.xml文件中添加相关依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency> ``` 2. 创建一个Job类,实现Quartz的Job接口,并在其中实现自己的业务逻辑。 ```java public class MyJob implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { // 业务逻辑代码 } } ``` 3. 创建一个Trigger类,用于设置任务的触发器。 ```java public class MyTrigger { /** * 创建一个cron表达式触发器 * @param cronExpression cron表达式 * @return 触发器对象 */ public static Trigger createCronTrigger(String cronExpression) { return TriggerBuilder.newTrigger().withSchedule(CronScheduleBuilder.cronSchedule(cronExpression)).build(); } } ``` 4. 创建一个Scheduler类,用于管理定时任务的启停和修改。 ```java @Component public class MyScheduler { @Autowired private SchedulerFactory schedulerFactory; /** * 添加一个定时任务 * @param jobName 任务名 * @param jobGroupName 任务分组名 * @param triggerName 触发器名 * @param triggerGroupName 触发器分组名 * @param jobClass 任务类 * @param cronExpression cron表达式 * @throws SchedulerException */ public void addJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName, Class<? extends Job> jobClass, String cronExpression) throws SchedulerException { Scheduler scheduler = schedulerFactory.getScheduler(); JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroupName).build(); Trigger trigger = MyTrigger.createCronTrigger(cronExpression); trigger = trigger.getTriggerBuilder().withIdentity(triggerName, triggerGroupName).build(); scheduler.scheduleJob(jobDetail, trigger); if(!scheduler.isShutdown()) { scheduler.start(); } } /** * 修改一个定时任务 * @param jobName 任务名 * @param jobGroupName 任务分组名 * @param triggerName 触发器名 * @param triggerGroupName 触发器分组名 * @param cronExpression cron表达式 * @throws SchedulerException */ public void modifyJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName, String cronExpression) throws SchedulerException { Scheduler scheduler = schedulerFactory.getScheduler(); TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName); CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey); if(trigger == null) { return; } String oldCronExpression = trigger.getCronExpression(); if(!oldCronExpression.equalsIgnoreCase(cronExpression)) { trigger = MyTrigger.createCronTrigger(cronExpression); trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).build(); scheduler.rescheduleJob(triggerKey, trigger); } } /** * 删除一个定时任务 * @param jobName 任务名 * @param jobGroupName 任务分组名 * @param triggerName 触发器名 * @param triggerGroupName 触发器分组名 * @throws SchedulerException */ public void deleteJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName) throws SchedulerException { Scheduler scheduler = schedulerFactory.getScheduler(); TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName); JobKey jobKey = JobKey.jobKey(jobName, jobGroupName); scheduler.pauseTrigger(triggerKey); scheduler.unscheduleJob(triggerKey); scheduler.deleteJob(jobKey); } } ``` 5. 在需要动态添加、修改、删除定时任务的地方,注入MyScheduler类,并调用其相应的方法即可。 ```java @Autowired private MyScheduler myScheduler; // 添加一个定时任务 myScheduler.addJob("job1", "group1", "trigger1", "group1", MyJob.class, "0/5 * * * * ?"); // 修改一个定时任务 myScheduler.modifyJob("job1", "group1", "trigger1", "group1", "0/10 * * * * ?"); // 删除一个定时任务 myScheduler.deleteJob("job1", "group1", "trigger1", "group1"); ``` 以上就是SpringBoot动态定时任务的实现方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值