1. 程式人生 > >34. springboot動態配置定時任務(通過資料庫配置)

34. springboot動態配置定時任務(通過資料庫配置)

1、pom.xml檔案

<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>

	<groupId>test.hanergy</groupId>
	<artifactId>taskTest</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>taskTest</name>
	<url>http://maven.apache.org</url>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.6.RELEASE</version>
		<relativePath /> <!-- lookup parent from repository -->
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<!-- fastJson -->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
			<version>1.2.3</version>
		</dependency>
		<!-- mybatis -->
		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>1.3.2</version>
		</dependency>
		<!-- mysql驅動包 -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
		</dependency>
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid</artifactId>
			<version>1.1.2</version>
		</dependency>

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

2、啟動類App.java

package task.test;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

/**
 * Hello world!
 *
 */
@SpringBootApplication
@EnableAutoConfiguration
@EnableScheduling
@MapperScan({"task.test.mapper"})
public class App 
{
    public static void main( String[] args )
    {
        SpringApplication.run(App.class, args);
    }
}

3、實體類Cron

package task.test.entity;

public class Cron {
    private String cronId;

    private String cron;

    public String getCronId() {
        return cronId;
    }

    public void setCronId(String cronId) {
        this.cronId = cronId == null ? null : cronId.trim();
    }

    public String getCron() {
        return cron;
    }

    public void setCron(String cron) {
        this.cron = cron == null ? null : cron.trim();
    }
}

4、CronMapper.java

package task.test.mapper;

import java.util.List;

import task.test.entity.Cron;

public interface CronMapper {
    int insert(Cron record);

    List<Cron> selectAll();
}

5、CronMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="task.test.mapper.CronMapper" >
  <resultMap id="BaseResultMap" type="task.test.entity.Cron" >
    <result column="cron_id" property="cronId" jdbcType="VARCHAR" />
    <result column="cron" property="cron" jdbcType="VARCHAR" />
  </resultMap>
  <insert id="insert" parameterType="task.test.entity.Cron" >
    insert into cron (cron_id, cron)
    values (#{cronId,jdbcType=VARCHAR}, #{cron,jdbcType=VARCHAR})
  </insert>
  <select id="selectAll" resultMap="BaseResultMap" >
    select cron_id, cron
    from cron
  </select>
</mapper>

6、任務排程配置類ScheduleConfig

package task.test.config;

import java.time.LocalDateTime;

import org.springframework.beans.factory.annotation.Autowired;
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 org.springframework.util.StringUtils;

import task.test.mapper.CronMapper;

@Configuration
@EnableScheduling
public class ScheduleConfig implements SchedulingConfigurer {

	@Autowired
	private CronMapper cronMapper;

	/**
	 * 執行定時任務.
	 */
	@Override
	public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
		taskRegistrar.addTriggerTask(
				// 1.新增任務內容(Runnable)
				() -> {
					// 1.1具體任務
					System.out.println("執行定時任務: " + LocalDateTime.now().toLocalTime());
				},
				// 2.設定執行週期(Trigger)
				triggerContext -> {
					// 2.1 從資料庫獲取執行週期
					String cron = cronMapper.selectAll().get(0).getCron();
					// 2.2 合法性校驗.
					if (StringUtils.isEmpty(cron)) {
						// 根據需求修改
					}
					// 2.3 返回執行週期(Date)
					return new CronTrigger(cron).nextExecutionTime(triggerContext);
				});
	}
}

7、application.yml配置檔案

spring:
  datasource:
    url: jdbc:mysql://***:3306/***
    username: root
    password: root

8、資料庫建表語句

DROP TABLE IF EXISTS `cron`;
CREATE TABLE `cron` (
 `cron_id` varchar(30),
 `cron` varchar(30) 
);
INSERT INTO `cron` VALUES ('1', '0/5 * * * * ?');