项目地址:nm-example
今天开发的时候遇到一个需求:
在集群部署服务时,需要处理定时任务不能同一时间执行。
后面实现的思路是这样的:
后之后就顺便在springBoot 上面实现了一下主要代码部分所以在这里记录一下。
- 每个定时任务都需要设置一下执行时间的间隔
- 每个定时任务执行时,都要到redis 里面检查一下,执行时间。
- 如果redis 里面没有值则可以认为没有别的服务执行过,此时可以执行任务
- 否则取出redis 中保存的上一次执行时间判定,如果上次执行的时间与当前时间判定,已经超过执行定时任务的时间间隔。
- 如果超过则可以执行,否则不执行
- 如何保证redis中存放的执行时间数据的原子性?
- 这里使用的是redis 的乐观锁,watch。数据提交时如果数据版本与原来取出的数据版本不一致则提交失败,此时放弃执行定时任务。所以在这里使用 “乐观锁” 非常合适
这里使用的springBoot 版本为:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.SR1</spring-cloud.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.4.3</version>
</dependency>
</dependencies>
</dependencyManagement>
以前使用的版本为:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
所以集成的时候出现了一些问题,原因是:
//原版本
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
//2.xx以后使
import org.springframework.data.redis.connection.RedisConnectionFactory;
创建:redisTemplate
/***
*
* @Auther: guzhangwen
* @BusinessCard https://blog.csdn.net/gu_zhang_w
* @Date: 2019/10/24
* @Time: 21:46
* @version : V1.0
*/
@Configuration
public class MyConfigure {
/**
* 操作redis 模板工具类
* @return
*/
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> goodsRedisTemplate = new RedisTemplate<>();
goodsRedisTemplate.setConnectionFactory(redisConnectionFactory);
/**
* 设置value 类型的序列化实现,如果不设置使用increment 会报错
*/
GenericToStringSerializer genericToStringSerializer = new GenericToStringSerializer(Object.class);
goodsRedisTemplate.setValueSerializer(genericToStringSerializer);
goodsRedisTemplate.setKeySerializer(new StringRedisSerializer());
goodsRedisTemplate.afterPropertiesSet();
return goodsRedisTemplate;
}
}
之后就可以通过注入使用redisTemplate了
网友评论