SpringBoot2.X之旅,Quartz的简单使用,实现定时任务的一种实现方式,可以控制启动和停止(Web Project)

一、新建web工程,引入quatrz的包等

pom.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.cobra</groupId>
    <artifactId>quartzlearn</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>quartzlearn</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-quartz</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

二、coding:

目录结构如下:

1、在job包下,新建MyJob类implements实现Job接口,在execute方法里面写上具体的业务:

package com.cobra.quartzlearn.job;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @Author: Baron
 * @Description:
 * @Date: Created in 2019/3/13 23:17
 */
public class MyJob implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        //具体业务
        Date date = new Date();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("现在的时间是:"+sf.format(date));
        System.out.println("Hello Quartz");
    }
}

2、在controller包下新建QuartzController类:

package com.cobra.quartzlearn.controller;

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Author: Baron
 * @Description:
 * @Date: Created in 2019/3/14 0:06
 */
@RestController
@RequestMapping("/schedule")
public class QuartzController {

    /**
     * 利用SimpleTrigger设定运行机制
     * @return
     * @throws ClassNotFoundException
     * @throws SchedulerException
     */
    @GetMapping("/bySimple")
    public String executeOnTime() throws ClassNotFoundException, SchedulerException {
        JobDetail jobDetail = JobBuilder.newJob(getMyClass()).withIdentity("myFirstJob").build();
        SimpleTrigger simpleTrigger = TriggerBuilder.newTrigger().withIdentity("myTrigger").startNow().withSchedule(
                SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).repeatForever()).build();
        StdSchedulerFactory factory = new StdSchedulerFactory();
        Scheduler scheduler = factory.getScheduler();
        scheduler.start();
        scheduler.scheduleJob(jobDetail, simpleTrigger);
        return "执行bySimple";
    }

    /**
     * 利用CronTrigger设定运行机制
     * @return
     * @throws SchedulerException
     * @throws ClassNotFoundException
     */
    @GetMapping("/byCron")
    public String execute() throws SchedulerException, ClassNotFoundException {
        JobDetail jobDetail = JobBuilder.newJob(getMyClass()).withIdentity("mySecondJob").build();
        CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("cronTrigger").withSchedule(CronScheduleBuilder.cronSchedule("0 0/1 * * * ?")).build();
        StdSchedulerFactory factory = new StdSchedulerFactory();
        Scheduler scheduler = factory.getScheduler();
        scheduler.start();
        scheduler.scheduleJob(jobDetail, cronTrigger);
        return "执行byCron";
    }

    /**
     * 通过类路径获取类
     * @return
     * @throws ClassNotFoundException
     */
    private Class getMyClass() throws ClassNotFoundException {
        Class myClass = Class.forName("com.cobra.quartzlearn.job.MyJob");
        return myClass;
    }

}

三、启动项目测试:

1、访问localhost:8080/schedule/bySimple,控制台输出:

2、访问localhost:8080/schedule/byCron,控制台输出:

四、可控制停止开启任务的demo

1、新建类ScheduleController 

package com.cobra.quartzlearn.controller;

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * @Author: Baron
 * @Description:
 * @Date: Created in 2019/3/14 0:06
 */
@RestController
@RequestMapping("/quartz")
public class ScheduleController {

    /**
     * 开始执行任务
     * @return
     * @throws ClassNotFoundException
     * @throws SchedulerException
     */
    @GetMapping("/start")
    public String start() throws ClassNotFoundException, SchedulerException {
        Scheduler scheduler = createScheduler();
        scheduler.start();
        return "执行任务!!!!!";
    }

    /**
     * 停止执行任务
     * @return
     * @throws SchedulerException
     * @throws ClassNotFoundException
     */
    @GetMapping("/stop")
    public String stop() throws SchedulerException, ClassNotFoundException {
        StdSchedulerFactory factory = new StdSchedulerFactory();
        Scheduler scheduler = factory.getScheduler();
        JobKey jobKey = new JobKey("myStoppableJob");
        scheduler.pauseJob(jobKey);
        scheduler.deleteJob(jobKey);
        return "停止任务!!!!!";
    }

    /**
     * 新建任务
     * @return
     * @throws SchedulerException
     * @throws ClassNotFoundException
     */
    public Scheduler createScheduler() throws SchedulerException, ClassNotFoundException {
        JobDetail jobDetail = JobBuilder.newJob(getMyClass()).withIdentity("myStoppableJob").build();
        SimpleTrigger simpleTrigger = TriggerBuilder.newTrigger().withIdentity("myStoppableTrigger").startNow().withSchedule(
                SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(2).repeatForever()).build();
        StdSchedulerFactory factory = new StdSchedulerFactory();
        Scheduler scheduler = factory.getScheduler();
        scheduler.scheduleJob(jobDetail, simpleTrigger);
        return scheduler;
    }

    /**
     * 通过类路径获取类
     * @return
     * @throws ClassNotFoundException
     */
    private Class getMyClass() throws ClassNotFoundException {
        Class myClass = Class.forName("com.cobra.quartzlearn.job.MyJob");
        return myClass;
    }

}

2、重启项目,测试访问localhost:8080/quartz/start,控制台输出日志:

访问localhost:8080/quartz/stop,控制台停止输出日志

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,需要在 Spring Boot 中集成 Quartz。可以通过添加以下依赖来实现: ```xml <!-- Quartz --> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.0</version> </dependency> ``` 然后,在 Spring Boot 中配置 Quartz。可以创建一个 `SchedulerFactoryBean` 实例,并设置相关属性,例如线程池大小、任务调度器等等。可以在 `application.properties` 文件中设置相关属性: ```properties # Quartz Scheduler spring.quartz.job-store-type=jdbc spring.quartz.jdbc.initialize-schema=always spring.quartz.properties.org.quartz.scheduler.instanceName=QuartzScheduler spring.quartz.properties.org.quartz.scheduler.instanceId=AUTO 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.useProperties=true spring.quartz.properties.org.quartz.jobStore.dataSource=myDataSource spring.quartz.properties.org.quartz.jobStore.tablePrefix=QRTZ_ spring.quartz.properties.org.quartz.dataSource.myDataSource.driverClassName=com.mysql.jdbc.Driver spring.quartz.properties.org.quartz.dataSource.myDataSource.URL=jdbc:mysql://localhost:3306/quartz spring.quartz.properties.org.quartz.dataSource.myDataSource.user=root spring.quartz.properties.org.quartz.dataSource.myDataSource.password=root 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.jobStore.isClustered=true spring.quartz.properties.org.quartz.jobStore.clusterCheckinInterval=20000 spring.quartz.properties.org.quartz.jobStore.maxMisfiresToHandleAtATime=1 ``` 然后,需要创建一个 `Job` 类来执行具体的任务。例如: ```java public class MyJob implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { // 执行具体的任务逻辑 System.out.println("Hello Quartz!"); } } ``` 最后,需要创建一个 `CronTriggerFactoryBean` 实例,并设置相关属性。例如: ```java @Configuration public class QuartzConfig { @Bean public JobDetailFactoryBean myJobDetail() { JobDetailFactoryBean factory = new JobDetailFactoryBean(); factory.setJobClass(MyJob.class); factory.setDurability(true); // 任务持久化 return factory; } @Bean public CronTriggerFactoryBean myCronTrigger(@Qualifier("myJobDetail") JobDetail jobDetail) { CronTriggerFactoryBean factory = new CronTriggerFactoryBean(); factory.setJobDetail(jobDetail); factory.setCronExpression("0/5 * * * * ?"); // 每隔 5 秒触发一次 return factory; } @Bean public SchedulerFactoryBean schedulerFactoryBean(@Qualifier("myCronTrigger") CronTrigger cronTrigger) { SchedulerFactoryBean factory = new SchedulerFactoryBean(); factory.setTriggers(cronTrigger); return factory; } } ``` 这里的 `myJobDetail` 方法返回一个 `JobDetailFactoryBean` 实例,它指定了具体的任务类。`myCronTrigger` 方法返回一个 `CronTriggerFactoryBean` 实例,它指定了触发器的具体规则。`schedulerFactoryBean` 方法返回一个 `SchedulerFactoryBean` 实例,它将任务和触发器关联起来,并返回一个 `Scheduler` 实例,可以通过它来启动停止任务调度器。 最后,在 Vue 中实现调用后端接口来启动停止任务调度器。可以使用 Axios 进行 HTTP 请求。例如: ```javascript import axios from 'axios' // 启动任务调度器 export function startScheduler () { return axios.post('/scheduler/start') } // 停止任务调度器 export function stopScheduler () { return axios.post('/scheduler/stop') } ``` 这里的 `/scheduler/start` 和 `/scheduler/stop` 是后端接口的 URL。可以在后端使用 Spring Boot 的 MVC 模块来实现这两个接口,例如: ```java @RestController @RequestMapping("/scheduler") public class SchedulerController { @Autowired private Scheduler scheduler; @PostMapping("/start") public void start() throws SchedulerException { scheduler.start(); } @PostMapping("/stop") public void stop() throws SchedulerException { scheduler.shutdown(); } } ``` 这里的 `scheduler` 是通过 `SchedulerFactoryBean` 创建的 `Scheduler` 实例,可以通过 `start()` 和 `shutdown()` 方法来启动停止任务调度器。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值