java动态spring定时器_SpringBoot实现动态定时任务

项目情况:

在当前项目中需要一个定时任务来清除过期的校验码,如果使用数据库存储过程的话不方便维护。因此采用SpringBoot自带的方式来设置定时任务。

技术说明:

SpringBoot自带的方式有两种可以实现:

一种是使用@Scheduled注解的方式,只需要在启动类或者它所在的类上添加@EnableScheduling注解允许执行定时任务,并且设置Schecduled注解的参数,诸如:

1.cron是设置定时执行的表达式,如 0 0/5 * * * ?每隔五分钟执行一次

2.zone表示执行时间的时区

3.fixedDelay 和fixedDelayString 表示一个固定延迟时间执行,上个任务完成后,延迟多长时间执行

4.fixedRate 和fixehttp://www.cppcns.comdRateString表示一个固定频率执行,上个任务开始后,多长时间后开始执行

5.initialDelay 和initialDelayString表示一个初始延迟时间,第一次被调用前延迟的时间

示例代码如下:

package com.allcom.service;

import com.allcom.dao.mysqlDao;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.scheduling.annotation.Scheduled;

import org.springframework.stereotype.Service;

/**

* @Author: zy

* @Description: 定时任务

* @Date: 2018/7/12_15:15

**/

@Service

public class TaskSerwww.cppcns.comvice {

@Autowired

private MysqlDao mysqlDao;

@Scheduled(fixedRate = 5*1000)

public void deleteInvalidCheckCode() {

mysqlDao.deleteInvalidCheckCode();

}

}

另一种方式是通过自定义配置类的方式,步骤如下:

第一步:新建一个类实现SchedulingConfigurer接口,并添加@

cbe52c062b38e33b0b6e1f1f303c41ca.png

第二步: 重写configureTasks方法如下代码所示:

package com.allcom.task;

import com.allcom.service.TaskService;

import org.apache.ibatis.annotations.Mapper;

import org.apache.ibatis.annotations.Select;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.context.annotation.Configuration;

import org.springframework.scheduling.Trigger;

import org.springframework.scheduling.TriggerContext;

import org.springframework.scheduling.annotation.SchedulingConfigurer;

import org.springframework.scheduling.config.ScheduledTaskRegistrar;

import org.springframework.scheduling.support.CronTrigger;

import java.util.Date;

@Configuration

public class MyScheduledTask implements SchedulingConfigurer {

@Mapper

public interface CronMapper {

@Select("select cron from user_cron limit 1")

String getCron();

}

@Autowired

@SuppressWarnings("all")

Crohttp://www.cppcns.comnMapper cronMapper;

@Autowired

@SuppressWarnings("all")

private TaskService taskService;

@Override

public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {

scheduledTaskRegistrar.addTriggerTask(new Runnable() {

@Override

public void run() {

try {

taskService.deleteInvalidCheckCode(); //异步定时操作

} catch (Exception e) {

e.printStackTrace();

}

}

}, new Trigger() {

@Override

public Date nextExecutionTime(TriggerContext triggerContext) {

String cron =cronMapper.getCron();

if("".equals(cron)||cron==null)

return null;

//定时任务触发,可修改定时任务的执行周期

CronTrigger trigger=new CronTrigger(cron);

Date nextExecDate= trigger.nextExecutionTime(triggerContext);

return nextExecDate;

}

});

}

}

第三步:启动项目,定时任务就自动添加了。

注意:这里我使用的是@Mapper注解使用Mybatis写了一个获取cron表达式的接口,可以从数据库中查询自定义表的cron字段值。这样的话项目运行的过程中,不用重新启动项目,只需要修改数据库中的字段值就可以动态的修改定时任务中的cron值,实现动态修改定时任务执行时间的功能。

但是,

这种方式适合于前台给几个特定的值给用户选择,不能让用户随便填。

附定时任务执行内容:

/**

* @Author: zy

* @Description: 删除用户过期的校验码

* @Date: 2018/7/12_15:20

**/

@Delete("DELETE from registinfo where id in (select id from (SELECT id FROM registinfo WHERE TIMESTAMPDIFF(MINUTE,lastupdatetime,NOW()) >= 15)a )")

void deleteInvalidCheckCode();

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

本文标题: SpringBoot实现动态定时任务

本文地址: http://www.cppcns.com/ruanjian/java/257595.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot 中使用 Quartz 定时器并自启动的步骤如下: 1. 添加依赖:在 pom.xml 文件中添加 Quartz 和 Spring Boot Starter 的依赖。 ```xml <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <version>2.3.2.RELEASE</version> </dependency> ``` 2. 配置定时器:在配置文件中添加 Quartz 定时器的配置。 ```properties # 配置 Quartz SchedulerFactory org.quartz.scheduler.instanceName=MyQuartzScheduler org.quartz.scheduler.instanceId=AUTO # 配置线程池 org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool org.quartz.threadPool.threadCount=5 org.quartz.threadPool.threadPriority=5 # 配置JobStore org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate org.quartz.jobStore.tablePrefix=QRTZ_ org.quartz.jobStore.dataSource=myDS org.quartz.jobStore.isClustered=true # 配置数据源 org.quartz.dataSource.myDS.driver=com.mysql.jdbc.Driver org.quartz.dataSource.myDS.URL=jdbc:mysql://localhost:3306/quartz?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai org.quartz.dataSource.myDS.user=root org.quartz.dataSource.myDS.password=123456 org.quartz.dataSource.myDS.maxConnections=10 # 配置自启动 org.quartz.startupHook.class=org.quartz.plugins.management.ShutdownHookPlugin org.quartz.plugin.shutdownhook.cleanShutdown=true ``` 3. 编写定时器:创建一个 Quartz 定时器 Job 类,实现 execute 方法。 ```java public class MyJob implements Job { @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { // 执行任务的逻辑代码 } } ``` 4. 创建定时器:在 Spring Boot 应用的启动类中创建定时器。 ```java @Configuration public class QuartzConfig { @Autowired private ApplicationContext applicationContext; @Bean public JobDetail myJobDetail() { return JobBuilder.newJob(MyJob.class) .withIdentity("myJob") .storeDurably() .build(); } @Bean public Trigger myTrigger() { SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(10) .repeatForever(); return TriggerBuilder.newTrigger() .forJob(myJobDetail()) .withIdentity("myTrigger") .withSchedule(scheduleBuilder) .build(); } @Bean public SchedulerFactoryBean schedulerFactory() { AutowiringSpringBeanJobFactory jobFactory = new AutowiringSpringBeanJobFactory(); jobFactory.setApplicationContext(applicationContext); Properties properties = new Properties(); properties.setProperty("org.quartz.scheduler.instanceName", "MyQuartzScheduler"); properties.setProperty("org.quartz.scheduler.instanceId", "AUTO"); properties.setProperty("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool"); properties.setProperty("org.quartz.threadPool.threadCount", "5"); properties.setProperty("org.quartz.threadPool.threadPriority", "5"); properties.setProperty("org.quartz.jobStore.class", "org.quartz.impl.jdbcjobstore.JobStoreTX"); properties.setProperty("org.quartz.jobStore.driverDelegateClass", "org.quartz.impl.jdbcjobstore.StdJDBCDelegate"); properties.setProperty("org.quartz.jobStore.tablePrefix", "QRTZ_"); properties.setProperty("org.quartz.jobStore.dataSource", "myDS"); properties.setProperty("org.quartz.jobStore.isClustered", "true"); properties.setProperty("org.quartz.dataSource.myDS.driver", "com.mysql.jdbc.Driver"); properties.setProperty("org.quartz.dataSource.myDS.URL", "jdbc:mysql://localhost:3306/quartz?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai"); properties.setProperty("org.quartz.dataSource.myDS.user", "root"); properties.setProperty("org.quartz.dataSource.myDS.password", "123456"); properties.setProperty("org.quartz.dataSource.myDS.maxConnections", "10"); properties.setProperty("org.quartz.startupHook.class", "org.quartz.plugins.management.ShutdownHookPlugin"); properties.setProperty("org.quartz.plugin.shutdownhook.cleanShutdown", "true"); SchedulerFactoryBean schedulerFactory = new SchedulerFactoryBean(); schedulerFactory.setQuartzProperties(properties); schedulerFactory.setAutoStartup(true); schedulerFactory.setJobFactory(jobFactory); schedulerFactory.setApplicationContextSchedulerContextKey("applicationContext"); schedulerFactory.setTriggers(myTrigger()); return schedulerFactory; } } ``` 在上述代码中,创建了一个 JobDetail 对象和一个 Trigger 对象,并将它们绑定在 SchedulerFactoryBean 中。SchedulerFactoryBean 会自动启动 Quartz 定时器,并执行定时任务
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值