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 源创会火热报名中,奖品多多哦 ...
随机推荐
- js 简单版发布留言 案例
<!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- Hadoop HA(高可用) 详细安装步骤
什么是HA? HA是High Availability的简写,即高可用,指当当前工作中的机器宕机后,会自动处理这个异常,并将工作无缝地转移到其他备用机器上去,以来保证服务的高可用.(简言之,有两台机器 ...
- vue 传入后台的数据多了个=
解决方法: 在前端值参时用{} 在后台接收时用Map 来自为知笔记(Wiz)
- [ vue ] xxxProject项目杂记
2020.4.9 加入eCharts 2020.4.8 完成article的显示,其间碰到全局路由守卫写的有错误,导致跳转报错.已修复. 加入keep-alive功能,缓存视图数据 疑问:如果在全局组 ...
- antd递归渲染左侧菜单
- Mysql查询阻塞的sql
SELECTp2.`HOST` 被阻塞方host,p2.`USER` 被阻塞方用户,r.trx_id 被阻塞方事务id,r.trx_mysql_thread_id 被阻塞方线程号,TIMESTAMPD ...
- 在实验中观察指针——C++ 函数参数的压栈顺序
前言 好久没写东西了,突发奇想,写写函数参数的压栈顺序 先看看这个问题 https://q.cnblogs.com/q/137133/ 然后看我简化的代码,猜输出结果是多少? #include< ...
- jenkins学习9-测试报告发邮件(Email Extension Plugin)
前言 前面已经实现在jenkins上展示html的测试报告,接下来只差最后一步,把报告发给你的领导,展示你的劳动成果了. 安装 Email Extension Plugin 插件 jenkins首页- ...
- HTML、CSS、Javascript、jQuery、Xml
HTML HTML简介 Hyper Text Markup Language (超文本标记语言)简写:HTML.通过标签来标记要显示的网页中的各个部分.网页文件本身是一种文本文件,通过在文本文件中添加 ...
- 带你学习Flood Fill算法与最短路模型
一.Flood Fill(连通块问题) 0.简介 Flood Fill(洪水覆盖) 可以在线性的时间复杂内,找到某个点所在的连通块! 注:基于宽搜的思想,深搜也可以做但可能会爆栈 flood fill ...