POM文件:
<!-- shedlock-spring 匹配spring-->
<dependency>
<groupId>net.javacrumbs.shedlock</groupId>
<artifactId>shedlock-spring</artifactId>
<version>3.0.0</version>
</dependency>
<!-- shedlock-mongo 这里采用mongodb作为中间表用于记录任务信息-->
<dependency>
<groupId>net.javacrumbs.shedlock</groupId>
<artifactId>shedlock-provider-mongo</artifactId>
<version>3.0.0</version>
</dependency>
启动类加入注解:
//其他注解省略 ······ PT30S,是30秒的意思
@EnableSchedulerLock(defaultLockAtMostFor = "PT30S")
public class Oms2RtocRtdcacheApplication {
public static void main(String[] args) {
SpringApplication.run(Oms2RtocRtdcacheApplication.class, args);
}
}
编写配置类:
使用mongodb作为中间表,存储任务信息。它还支持jdbc,redis等等一大堆的数据库用来存储任务信息,这里使用mongodb,配置类需要给它把连接实例放进去,使用其他数据库同理。
import com.mongodb.client.MongoCollection;
import net.javacrumbs.shedlock.core.LockProvider;
import net.javacrumbs.shedlock.provider.mongo.MongoLockProvider;
import org.bson.Document;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.core.MongoTemplate;
@Configuration
public class ShedLockConfig {
@Autowired
private MongoTemplate template;
@Bean
public LockProvider lockProvider(){
MongoCollection<Document> mongo = template.getCollection("realtimework");
return new MongoLockProvider(mongo);
}
}
定时任务:
//每2秒执行
//name 是定时任务的名字
//lockAtLeastFor 是持有锁的最小时间,单位毫秒
//lockAtMostFor 是持有锁的最大时间,单位毫秒
//@SchedulerLock注解还有两个参数,是最小、最大时间字符串的方式表示
@Scheduled(cron = "*/2 * * * * ?")
@SchedulerLock(name = "dataHouseKeepingLock", lockAtLeastFor = 2000, lockAtMostFor = 2000)
public void test1()throws Exception{
log.info("定时任务执行" );
}
执行定时任务,mongodb中产生的记录。它保证集群或者分布式部署下,多个节点同时执行定时任务,只有一个节点能生效执行。原理就是通过时间来判断,所以,多个(服务器)节点的时间需要一致。
可以使用以后,就可以将同一个项目,同样的代码,复制多分,部署到各个节点上了。他们是交错执行的。