弹簧引导+复述,如何实现监听过期关键的方法?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!
前言:
在订单业务中,有时候需要对订单设置有效期,有效期到了后如果还未支付,就需要修改订单状态。对于这种业务的实现,有多种不同的办法,比如:
1,使用querytz,每次生成一个订单,就创建一个定时任务,到期后执行业务代码;
2, rabbitMq中的延迟队列;
3,对复述的关键进行监控;
, 1,引入依赖
& lt; dependency> & lt; groupId> org.springframework.boot & lt; artifactId> spring-boot-starter-data-redis & lt;/dependency>
2,修改启动的复述,配置
春: #复述, 复述: 数据库:0 主持人:127.0.0.1 密码:redis_123456 端口:6379
3,在服务器中修改复述。参看配置文件(原来notify-keyspace-events属性是““;空的,我们只需要填上“前女友”就行了)
notify-keyspace-events“Ex"
4,创建一个复述,监控类,用于监控过期的关键,该类需继承KeyExpirationEventMessageListener
进口org.slf4j.Logger; 进口org.slf4j.LoggerFactory; 进口org.springframework.data.redis.connection.Message; 进口org.springframework.data.redis.listener.KeyExpirationEventMessageListener; 进口org.springframework.data.redis.listener.RedisMessageListenerContainer; 进口java.nio.charset.StandardCharsets;/* * * @program: SpringCloud * @description:复述,关键过期监听 * @author:张艺谋 * @create: 2020-03-24十四14 */公开课KeyExpiredListener延伸KeyExpirationEventMessageListener { 公共KeyExpiredListener (RedisMessageListenerContainer listenerContainer) { 超级(listenerContainer); } @Override 公共空间>进口com.zy.rabbitmq.base.Listener.KeyExpiredListener; 进口org.springframework.beans.factory.annotation.Autowired; 进口org.springframework.context.annotation.Bean; 进口org.springframework.context.annotation.Configuration; 进口org.springframework.data.redis.connection.RedisConnectionFactory; 进口org.springframework.data.redis.listener.RedisMessageListenerContainer;/* * * @program: SpringCloud * @description:复述,配置类 * @author:张艺谋 * @create: 2020-03-24真理 */@ configuration 公开课RedisConfiguration { @ autowired 私人RedisConnectionFactory RedisConnectionFactory; @ bean 公共RedisMessageListenerContainer RedisMessageListenerContainer () { RedisMessageListenerContainer RedisMessageListenerContainer=new RedisMessageListenerContainer (); redisMessageListenerContainer.setConnectionFactory (redisConnectionFactory); 返回redisMessageListenerContainer; } @ bean 公共KeyExpiredListener KeyExpiredListener () { 返回新KeyExpiredListener (this.redisMessageListenerContainer ()); } }
6,这里提供一个复述,工具类,用于存储值,获取值,获取过期时间等操作。
进口org.springframework.data.redis.core.RedisTemplate; 进口org.springframework.stereotype.Component; 进口org.springframework.util.CollectionUtils; 进口javax.annotation.Resource; 进口java.util.concurrent.TimeUnit;/* * *复述,工具类 * @Author ZhangYi */@ component 公开课RedisUtil { @ 私人RedisTemplate<字符串,Object>redisTemplate;/* * *指定缓存失效时间 * * @param键键 * @param时间时间(秒) * @return */公共布尔到期(字符串键,长时间){ 尝试{ 如果时间比;0){ redisTemplate。(到期时间,关键TimeUnit.SECONDS); } 返回true; }捕捉(异常e) { e.printStackTrace (); 返回错误; } }/* * *根据关键获取过期时间 * * @param键键不能为null * @return时间(秒)返回0代表为永久有效 */公共长getExpire (String键){ redisTemplate返回。getExpire(关键,TimeUnit.SECONDS); }/* * *判断键是否存在 * * @param键键 * @return真实存在假不存在 */公共布尔hasKey (String键){ 尝试{ 返回redisTemplate.hasKey(关键); }捕捉(异常e) { e.printStackTrace (); 返回错误; } }/* * *删除缓存 * * @param关键可以传一个值或多个 */@SuppressWarnings (“unchecked") 公共空间德尔(字符串…键){ 如果(钥匙!=零,,关键。长度比;0){ 如果(关键。长度==1){ redisTemplate.delete (key [0]); 其他}{ redisTemplate.delete (CollectionUtils.arrayToList(键)); } } }//============================字符串=============================/* * *普通缓存获取 * * @param键键 * @return值 */公共对象(字符串键){ 返回键==null, # 63;空:redisTemplate.opsForValue () . get(关键); }/* * *普通缓存放入 * * @param键键 * @param值值 * @return真正成功假失败 */公共布尔组(字符串键,对象值){ 尝试{ redisTemplate.opsForValue()。集(关键字,值); 返回true; }捕捉(异常e) { e.printStackTrace (); 返回错误; } }/* * *普通缓存放入并设置时间 * * @param键键 * @param值值 * @param时间时间(秒)时间要大于0如小果时间于等于0将设置无限期 * @return真正成功假失败 */公共布尔(字符串键,对象的价值,长时间){ 尝试{ 如果时间比;0){ redisTemplate.opsForValue()。集(价值,关键时候,TimeUnit.SECONDS); 其他}{ 集(关键字,值); } 返回true; }捕捉(异常e) { e.printStackTrace (); 返回错误; } } }弹簧引导+复述,如何实现监听过期关键的方法