springboot整合quartz定时任务,并实现动态动态管理,实现调用service注入。

1.创建一个boot项目

创建一个简单的boot项目,加入web,和mysql的依赖。此处不赘述。
项目结构图:

在这里插入图片描述

2.依赖

		<!--整合quartz-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-quartz</artifactId>
        </dependency>

3.配置

在这里插入图片描述

1.sql的xml文件,根据你定义的实体类写。
2.数据库等

application.properties

#mysql数据库
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.password=1234
spring.datasource.username=admin
#spring.datasource.url=jdbc:mysql://127.0.0.1:3306/drl?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
spring.datasource.url=jdbc:mysql://47.102.143.37:3306/drl?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
#转化时区,用于展示数据
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8
#log配置
logging.file.name=/data/log/sysadmin.log
logging.file.max-size=10MB
logging.file.max-history=7
logging.pattern.dateformat=yyyy-MM-dd hh:mm:ss SSS

#项目入口名称
#端口号、入口名称
server.port=8081
server.servlet.context-path=/sysadmin
#扫描xml文件
mybatis.mapper-locations=classpath:com/sysadmin/mapper/*.xml

application-quartz.properties

#整合quartz
spring.quartz.properties.org.quartz.scheduler.instanceName=aQuartzScheduler
spring.quartz.properties.org.quartz.scheduler.instanceId=AUTO
spring.quartz.properties.org.quartz.scheduler.rmi.export=false
spring.quartz.properties.org.quartz.scheduler.rmi.proxy=false
spring.quartz.properties.org.quartz.scheduler.wrapJobExecutionInUserTransaction=false

spring.quartz.properties.org.quartz.jobStore.misfireThreshold=50000
spring.quartz.properties.org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
spring.quartz.properties.org.quartz.jobStore.tablePrefix=QRTZ_
spring.quartz.properties.org.quartz.jobStore.isClustered=true
spring.quartz.properties.org.quartz.jobStore.useProperties=false
spring.quartz.properties.org.quartz.jobStore.clusterCheckinInterval=20000

spring.quartz.properties.org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
spring.quartz.properties.org.quartz.threadPool.threadCount=10
spring.quartz.properties.org.quartz.threadPool.threadPriority=5
spring.quartz.properties.org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread=true
# 数据库方式
spring.quartz.job-store-type=jdbc

配置完成

3.开始定义

1.工具类

用于service根据名字注入

**
 * @Description
 * @date 2019/11/17 9:04
 * @since JDK1.8
 **/
@Component
public class SpringContextUtil implements ApplicationContextAware {

    private static ApplicationContext applicationContext;     //Spring应用上下文环境

    /**
     * 实现ApplicationContextAware接口的回调方法,设置上下文环境
     *
     * @param applicationContext
     * @throws BeansException
     */
    @Autowired
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {

        SpringContextUtil.applicationContext = applicationContext;
    }

    /**
     * @return ApplicationContext
     */
    public static ApplicationContext getApplicationContext() {

        return SpringContextUtil.applicationContext;
    }

    /**
     * 获取对象
     *
     * @param name
     * @return Object 一个以所给名字注册的bean的实例
     * @throws BeansException
     */
    public static Object getBean(String name) throws BeansException {

        if (applicationContext != null) {
            return applicationContext.getBean(name);
        } else {
            return null;
        }
    }
    }

2.quartz

SpringJobFactory 解决job中service注入为空的问题。

/**
 * @authorl
 * @Description 解决job中service注入为空的问题。
 * @date 2019/12/17 0017 10:35
 * @since JDK1.8
 **/
@Component
public class SpringJobFactory extends AdaptableJobFactory {

    @Autowired
    private AutowireCapableBeanFactory capableBeanFactory;

    @Override
    protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
        //调用父类的方法
        Object jobInstance = super.createJobInstance(bundle);
        //进行注入
        capableBeanFactory.autowireBean(jobInstance);
        return jobInstance;
    }

}
/**
 * @Description 定时任务配置,注入必要的bean
 * @date 2019/12/17 0017 10:46
 * @since JDK1.8
 **/
@Configuration
public class QuartzConfig {

    /**
     * 重写AdaptableJobFactory,解决service注入为null的问题
     */
    @Autowired
    private SpringJobFactory springJobFactory;

    @Bean
    public SchedulerFactoryBean schedulerFactoryBean() {
        SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
        schedulerFactoryBean.setJobFactory(springJobFactory);
        return schedulerFactoryBean;
    }

    @Bean
    public Scheduler scheduler() {
        return schedulerFactoryBean().getScheduler();
    }
}

3.调度中心

/**
 * @author
 * @Description 调度中心
 * @date 2019/12/16 0016 17:26
 * @since JDK1.8
 **/
@Configuration
public class QuartzScheduler {
    // 任务调度
    @Autowired
    private Scheduler scheduler;

    /**
     * 开启某个任务
     *
     * @param taskDao 任务对象
     * @throws
     */
    public void startJob(TaskDao taskDao) throws SchedulerException {
        String name = taskDao.getServiceName();
        String group = taskDao.getTaskType().name();
        String time = taskDao.getCronExpression();
        // 通过JobBuilder构建JobDetail实例,JobDetail规定只能是实现Job接口的实例
        // JobDetail 是具体Job实例
        AbstractTask abstractTask = (AbstractTask) SpringContextUtil.getBean(name);
        JobDetail jobDetail = JobBuilder.newJob(abstractTask.getClass()).withIdentity(name, group).build();
        // 基于表达式构建触发器
        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(time);
        // CronTrigger表达式触发器 继承于Trigger
        // TriggerBuilder 用于构建触发器实例
        CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(name, group)
                .withSchedule(cronScheduleBuilder).build();
        // CronTrigger表达式触发器 继承于Trigger
        // TriggerBuilder 用于构建触发器实例
//        CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(name, group)
//                .withSchedule(CronScheduleBuilder.cronSchedule(time).withMisfireHandlingInstructionIgnoreMisfires()).build();
        scheduler.scheduleJob(jobDetail, cronTrigger);
    }

    /**
     * 删除某个任务
     *
     * @param taskDao 任务对象
     * @throws
     */
    public void deleteJob(TaskDao taskDao) throws SchedulerException {
        JobKey jobKey = new JobKey(taskDao.getServiceName(), taskDao.getTaskType().name());
        JobDetail jobDetail = scheduler.getJobDetail(jobKey);
        if (jobDetail == null)
            return;
        scheduler.deleteJob(jobKey);
    }

    /**
     * 获取Job信息
     *
     * @param taskDao
     * @return
     * @throws
     */
    public String getJobInfo(TaskDao taskDao) throws SchedulerException {
        TriggerKey triggerKey = new TriggerKey(taskDao.getServiceName(), taskDao.getTaskType().name());
        CronTrigger cronTrigger = (CronTrigger) scheduler.getTrigger(triggerKey);
        return String.format("time:%s,state:%s", cronTrigger.getCronExpression(),
                scheduler.getTriggerState(triggerKey).name());
    }

    /**
     * 修改某个任务的执行时间
     *
     * @param taskDao 任务对象
     * @return
     * @throws
     */
    public boolean modifyJob(TaskDao taskDao) throws SchedulerException {
        Date date = null;
        TriggerKey triggerKey = new TriggerKey(taskDao.getServiceName(), taskDao.getTaskType().name());
        CronTrigger cronTrigger = (CronTrigger) scheduler.getTrigger(triggerKey);
        String oldTime = cronTrigger.getCronExpression();
        if (!oldTime.equalsIgnoreCase(taskDao.getCronExpression())) {
            CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(taskDao.getServiceName(), taskDao.getTaskType().name())
                    .withSchedule(CronScheduleBuilder.cronSchedule(taskDao.getCronExpression()).withMisfireHandlingInstructionIgnoreMisfires())
                    .build();
            date = scheduler.rescheduleJob(triggerKey, trigger);
        }
        return date != null;
    }

    /**
     * 暂停所有任务
     *
     * @throws
     */
    public void pauseAllJob() throws SchedulerException {
        scheduler.pauseAll();
    }

    /**
     * 暂停某个任务
     *
     * @param taskDao 任务对象
     * @throws
     */
    public void pauseJob(TaskDao taskDao) throws SchedulerException {
        JobKey jobKey = new JobKey(taskDao.getServiceName(), taskDao.getTaskType().name());
        JobDetail jobDetail = scheduler.getJobDetail(jobKey);
        if (jobDetail == null)
            return;
        scheduler.pauseJob(jobKey);
    }

    /**
     * 恢复所有任务
     *
     * @throws
     */
    public void resumeAllJob() throws SchedulerException {
        scheduler.resumeAll();
    }

    /**
     * 恢复某个任务
     *
     * @param taskDao 任务对象
     * @throws
     */
    public void resumeJob(TaskDao taskDao) throws SchedulerException {
        JobKey jobKey = new JobKey(taskDao.getServiceName(), taskDao.getTaskType().name());
        JobDetail jobDetail = scheduler.getJobDetail(jobKey);
        if (jobDetail == null)
            return;
        scheduler.resumeJob(jobKey);
    }
}

从调度重新的startJob方法,可以看出TaskDao的属性。TaskDao的创建啥的就自己写咯,都是千篇一律的service,controller之类。需要注意的是在创建修改TaskDao对象是,要对任务进行对应的start和stop操作。如更新时,需要把任务delete了,更新库之后再start。
String name = taskDao.getServiceName();(注入的servicename)
String group = taskDao.getTaskType().name();(任务分组,这个可以一样)
String time = taskDao.getCronExpression();(cron表达式)
如每天9-16点每3秒执行一次:0/3 * 9-16 * * ?

提供一个cron表达式工具:
链接:https://pan.baidu.com/s/1Kh9d2EuPVjFq8lIz9wiRBA
提取码:5xhy
复制这段内容后打开百度网盘手机App,操作更方便哦

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!对于Quartz和Spring Boot结合实现动态管理定时任务,可以按照以下步骤进行操作: 1. 添加依赖:在Spring Boot项目的pom.xml文件中添加Quartz和Spring Boot的相关依赖。示例: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency> ``` 2. 创建定时任务类:编写一个实现Job接口定时任务类,实现其中的execute方法,该方法定义了定时任务的具体逻辑。示例: ```java public class MyJob implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { // 执行定时任务逻辑 System.out.println("Hello, Quartz!"); } } ``` 3. 配置定时任务触发器:在Spring Boot的配置文件中配置定时任务的触发器。示例: ```yaml spring: quartz: job-store-type: memory properties: org: quartz: scheduler: instanceName: MyScheduler jobStore: useProperties: true threadPool: threadCount: 3 job-details: myJob: class: com.example.MyJob triggers: myTrigger: job-detail: myJob cron: "0/5 * * * * ?" ``` 4. 启用Quartz:在Spring Boot的启动类上添加@EnableScheduling注解,启用Quartz定时任务。示例: ```java @SpringBootApplication @EnableScheduling public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } } ``` 5. 动态管理定时任务:通过Quartz的API来实现动态添加、修改和删除定时任务的功能。可以在Service或Controller层调用Quartz的相关方法来实现。示例: ```java @Autowired private Scheduler scheduler; public void addJob(String jobName, String jobGroup, String cronExpression) throws SchedulerException { JobDetail jobDetail = JobBuilder.newJob(MyJob.class) .withIdentity(jobName, jobGroup) .build(); Trigger trigger = TriggerBuilder.newTrigger() .withIdentity(jobName, jobGroup) .withSchedule(CronScheduleBuilder.cronSchedule(cronExpression)) .build(); scheduler.scheduleJob(jobDetail, trigger); } public void updateJob(String jobName, String jobGroup, String cronExpression) throws SchedulerException { TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup); CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey); trigger = trigger.getTriggerBuilder() .withIdentity(triggerKey) .withSchedule(CronScheduleBuilder.cronSchedule(cronExpression)) .build(); scheduler.rescheduleJob(triggerKey, trigger); } public void deleteJob(String jobName, String jobGroup) throws SchedulerException { scheduler.deleteJob(JobKey.jobKey(jobName, jobGroup)); } ``` 以上就是使用Quartz和Spring Boot实现动态管理定时任务的基本步骤。您可以根据实际需求进行调整和扩展。希望能对您有所帮助!如果您还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值