有时我们只需要简单的调度功能,那么使用Spring boot 自带的Schedule就可以满足了、
要是需要复杂的管控,就使用Quartz框架,请参阅Spring boot下使用quartz
h和Spring boot下使用quartz–多实例
这章讲述的是Spring boot 自带的Schedule-多实例解决方法
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>com.programmer</groupId>
<artifactId>spring-boot-test</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>spring-boot-task2</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
</properties>
<!-- spring boot parent节点,引入这个之后,在下面和spring boot相关的就不需要引入版本了; -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.1.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- shedlock -->
<dependency>
<groupId>net.javacrumbs.shedlock</groupId>
<artifactId>shedlock-spring</artifactId>
<version>0.12.0</version>
</dependency>
<dependency>
<groupId>net.javacrumbs.shedlock</groupId>
<artifactId>shedlock-provider-jdbc-template</artifactId>
<version>0.12.0</version>
</dependency>
<dependency>
<groupId>net.javacrumbs.shedlock</groupId>
<artifactId>shedlock-provider-jdbc</artifactId>
<version>0.12.0</version>
</dependency>
</dependencies>
</project>
2. 配置文件
import java.time.Duration;
import javax.sql.DataSource;
import net.javacrumbs.shedlock.core.LockProvider;
import net.javacrumbs.shedlock.provider.jdbctemplate.JdbcTemplateLockProvider;
import net.javacrumbs.shedlock.spring.ScheduledLockConfiguration;
import net.javacrumbs.shedlock.spring.ScheduledLockConfigurationBuilder;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
//DruidAutoConfiguration是连接数据库的配置文件,因为要在数据库加载完成之后在执行该配置
//不懂的可以参考[Spring boot下使用quartz--多实例](http://blog.csdn.net/yy756127197/article/details/75980459) 文末
@AutoConfigureAfter(DruidAutoConfiguration.class)
public class SchduleConfig {
@Bean
public LockProvider lockProvider(DataSource ds) {
//test_shedlock 是数据表
return new JdbcTemplateLockProvider(ds,"test_shedlock");
}
@Bean
public ScheduledLockConfiguration taskScheduler(LockProvider lockProvider) {
return ScheduledLockConfigurationBuilder
.withLockProvider(lockProvider)
.withPoolSize(10)
.withDefaultLockAtMostFor(Duration.ofMinutes(10))
.build();
}
}
3. 实现类
import lombok.extern.slf4j.Slf4j;
import net.javacrumbs.shedlock.core.SchedulerLock;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
@Service //也可以是@Component
@EnableScheduling
@Slf4j
public class ScheduleTaskService {
@Scheduled(fixedDelayString = "${schedule.test.time}")
@SchedulerLock(name = "scheduleTest", lockAtLeastForString = "${schedule.test.time}", lockAtMostForString = "${schedule.test.time}" )
public void schdule(){
log.info("====调用Spring Schedule 开始====");
}
}
schedule.test.time = 60000 是配置在application.properties中的,也可以直接写死在代码里
4. 数据表 test_shedlock
CREATE TABLE public.test_shedlock (
name varchar(64) NOT NULL,
lock_until timestamp NULL,
locked_at timestamp NULL,
locked_by varchar(255) NULL,
CONSTRAINT shedlock_pkey PRIMARY KEY (name)
)
WITH (
OIDS=FALSE
);
启动两个实例测试,VERY GOOD
喜欢请点赞,不懂请留言^^