java 监听redis事件
第一步:利用RDM等redis连接工具查看相应事件,然后去网上搜索 一下,会有redis各种事件的说明,选择契合业务的事件;

第二步:创建监听处理类;
1 package com.lechuang.auth.advice;
2
3 import com.lechuang.common.core.entity.LeChuangAuthUser;
4 import com.lechuang.common.core.entity.system.SystemUser;
5 import com.lechuang.common.core.utils.LeChuangUtil;
6 import com.lechuang.common.redis.service.RedisDBService;
7 import com.lechuang.common.redis.service.RedisService;
8 import lombok.RequiredArgsConstructor;
9 import lombok.extern.slf4j.Slf4j;
10 import org.springframework.beans.factory.annotation.Autowired;
11 import org.springframework.data.redis.connection.Message;
12 import org.springframework.data.redis.connection.MessageListener;
13 import org.springframework.scheduling.annotation.Async;
14 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
15 import org.springframework.security.core.userdetails.User;
16 import org.springframework.security.oauth2.common.DefaultOAuth2AccessToken;
17 import org.springframework.security.oauth2.provider.OAuth2Authentication;
18 import org.springframework.security.oauth2.provider.token.TokenStore;
19 import org.springframework.stereotype.Service;
20 import org.springframework.util.ObjectUtils;
21
22 import javax.annotation.Resource;
23 import java.lang.reflect.Field;
24 import java.util.LinkedHashMap;
25
26 /**
27 * 功能描述:Redis监听
28 * 作者:唐泽齐
29 */
30 @Slf4j
31 @Service
32 @RequiredArgsConstructor
33 public class LiveRedisKeysExpireListener implements MessageListener {
34
35 @Autowired
36 private RedisDBService redisDBService;
37 @Resource
38 private TokenStore tokenStore;
39
40 @Override
41 public void onMessage(Message message, byte[] pattern) {
42 Object o = redisDBService.getAndSet(9, "renewUser:" + message.toString(), null);
43 if(!ObjectUtils.isEmpty(o)) {
44 log.info("处理用户缓存信息更新:"+message.toString());
45 renewToken(o,message.toString());
46 } else {
47 redisDBService.del(9,"renewUser:" + message.toString());
48 }
49 }
50
51 @Async
52 void renewToken(Object o,String tokenKey) {
53 try {
54 SystemUser user = (SystemUser) o;
55 OAuth2Authentication authentication = tokenStore.readAuthentication(tokenKey);
56 UsernamePasswordAuthenticationToken token = (UsernamePasswordAuthenticationToken) authentication.getUserAuthentication();
57 LinkedHashMap details = (LinkedHashMap) token.getDetails();
58 LinkedHashMap principal = (LinkedHashMap) details.get("principal");
59
60 LeChuangAuthUser authUser = (LeChuangAuthUser) token.getPrincipal();
61
62 //更新username
63 Field username = User.class.getDeclaredField("username");
64 username.setAccessible(true);
65 username.set(authUser,user.getUsername());
66 //更新 avatar
67 authUser.setAvatar(user.getAvatar());
68 //将新凭证 写入 token
69 DefaultOAuth2AccessToken oauthtoken = new DefaultOAuth2AccessToken(tokenKey);
70 oauthtoken.setTokenType("Bearer");
71 tokenStore.storeAccessToken(oauthtoken, authentication);
72 redisDBService.del(9,"renewUser:"+tokenKey);
73 } catch (Exception e) {
74 e.printStackTrace();
75 }
76 }
77
78 }
第三步:将监听处理类加入项目环境配置中,伴随项目启动;
1 package com.lechuang.auth.advice;
2
3 import org.springframework.context.annotation.Bean;
4 import org.springframework.context.annotation.Configuration;
5 import org.springframework.data.redis.connection.RedisConnectionFactory;
6 import org.springframework.data.redis.listener.PatternTopic;
7 import org.springframework.data.redis.listener.RedisMessageListenerContainer;
8
9 import javax.annotation.Resource;
10
11 /**
12 * 功能描述:Redis监听配置
13 * 作者:唐泽齐
14 */
15 @Configuration
16 public class RedisListenerConfig {
17
18 @Resource
19 private LiveRedisKeysExpireListener liveRedisKeysExpireListener;
20
21 @Bean
22 RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
23 RedisMessageListenerContainer container = new RedisMessageListenerContainer();
24 container.setConnectionFactory(connectionFactory);
25 container.addMessageListener(liveRedisKeysExpireListener, new PatternTopic("__keyevent@9__:expire"));
26 return container;
27 }
28
29 }
java 监听redis事件的更多相关文章
- springboot使用Redis,监听Redis键过期的事件设置与使用代码
我使用的是Windows下的Redis服务,所以一下Redis设置都是在Windows平台进行. 1.修改Redis配置文件 1.1:Windows下的Redis存在两个配置文件 修改带有servic ...
- Java监听模式
说明 生活中,监听无处不在.比如说,手机播放音乐功能,也是一种监听:你不点击播放按钮,手机就不放歌,当你点击时,手机就播放音乐.即触发某种行为,便执行相应的动作. 组成 Java监听模式右三个部分组成 ...
- [JS]笔记12之事件机制--事件冒泡和捕获--事件监听--阻止事件传播
-->事件冒泡和捕获-->事件监听-->阻止事件传播 一.事件冒泡和捕获 1.概念:当给子元素和父元素定义了相同的事件,比如都定义了onclick事件,点击子元素时,父元素的oncl ...
- JS 中的事件绑定、事件监听、事件委托
事件绑定 要想让 JavaScript 对用户的操作作出响应,首先要对 DOM 元素绑定事件处理函数.所谓事件处理函数,就是处理用户操作的函数,不同的操作对应不同的名称. 在JavaScript中,有 ...
- javascript事件监听与事件委托
事件监听与事件委托 在js中,常用到element.addEventListener()来进行事件的监听.但是当页面中存在大量需要绑定事件的元素时,这种方式可能会带来性能影响.此时,我们可以用事件 ...
- 在Javascript中监听flash事件(转)
在Javascript中监听flash事件,其实有两种做法: 1.在特定的环境下(例如专门制作的flash),大家约定一个全局函数,然后在flash的事件中用ExternalInterface.cal ...
- Fragment中监听onKey事件,没你想象的那么难。
项目中越来越多的用到Fragment,在用Fragment取代TabHost的时候遇到了一个问题,我们都知道,TabHost的Tab为Activity实例,有OnKey事件,但是Fragment中没有 ...
- js 事件监听 冒泡事件
js 事件监听 冒泡事件 的取消 [自己写框架时,才有可能用到] <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitiona ...
- 原 JS监听回车事件
原 JS监听回车事件 发表于2年前(2014-06-04 10:16) 阅读(6101) | 评论(0) 11人收藏此文章, 我要收藏 赞0 1月16日厦门 OSC 源创会火热报名中,奖品多多哦 ...
随机推荐
- 【】Apache Ranger剖析:Hadoop生态圈的安全管家
前言 2016年,Hadoop迎来了自己十周岁生日.过去的十年,Hadoop雄霸武林盟主之位,号令天下,引领大数据技术生态不断发展壮大,一时间百家争鸣,百花齐放.然而,兄弟多了不好管,为了抢占企业级市 ...
- Linux_无法解析域名
现象如下:ping baidu.com不通,但是ping 114.114.114.114能通 产生的问题:无法使用 wget下载包 解决方法:增加DNS配置. 注:配置的域名解析地址必须能Ping通.
- 工厂模式(python)
以字符串作为传递参数 以类名作为传递参数 来自为知笔记(Wiz)
- python的作用域、globals()-全局变量 和 locals()-局部变量
在python中,函数会创建一个自己的作用域,也称为为命名空间.当我们在函数内部访问某个变量时,函数会优先在自己的命名空间中寻找. 我们自己定义的全局变量均在python内建的globals()函数中 ...
- redis持久层设置
1.默认为RDB存储方式,每次修改数据库,需要输入指令save才会存入磁盘的dump.rdb文件里,相当于备份快照,下次开启服务后会自动缓存于内存里.当然,满足下面几个条件也会自动保存到磁盘:save ...
- js箭头函数 的 (e) => { } 写法笔记
1. (e) => {} 是ES 6 新语法,默认是Es 5.1,因此在这里设置一下就不会提示红色下划线了 2.使用: (e) => {} , 其实就是function (e){} 的缩 ...
- Pandas系列(十七)-EDA(pandas-profiling)
对于探索性数据分析来说,做数据分析前需要先看一下数据的总体概况,pandas_profiling工具可以快速预览数据. 安装 pip install pandas-profiling 使用 impor ...
- Servlet简单实现开发部署过程
注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6512008683445027331/ 主要是从下面三个步骤实现我们的预期: (1)构建开发环境: (2)开发Ser ...
- js字符串首字母大写的不同写法
写法一: let name = 'hello' name.charAt(0).toUpperCase() + name.slice(1) 写法二: let name = 'hello' name.sl ...
- SYCOJ#1077、01字符串
题目-01字符串 (shiyancang.cn) 1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int main() 5 { 6 ...