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 源创会火热报名中,奖品多多哦 ...
随机推荐
- SpringBoot集成jasperreport实现打印功能
1.jaspersoft studio工具下载地址 下载直通车 2.工具使用方法查看以下链接 工具使用 3.将工具编译后的.jasper文件放到SpringBoot项目的resources/templ ...
- 初识python 之 cx_oracle
使用cx_oracle操作oracle数据库 oracleClient 包 #!/user/bin env python # author:Simple-Sir # create_time: 2021 ...
- JMeter_请求header
在接口调试的时候,请求参数确认正确无误,但是请求失败! 通过对比header,发现header缺少一些字段(token)以及传入的值不正确(Content-Type) 增加这些字段信息后,接口调试成功 ...
- Python中的GIL锁
在Python中,可以通过多进程.多线程和多协程来实现多任务. 在多线程的实现过程中,为了避免出现资源竞争问题,可以使用互斥锁来使线程同步(按顺序)执行. 但是,其实Python的CPython(C语 ...
- Git 如何放弃所有本地修改
git checkout . #本地所有的修改,没有提交的,都返回到原来的状态 git stash #把所有没有提交的修改暂存到stash里面.可用git stash pop恢复. git reset ...
- 曾经大量使用的Model1开发模式,虽不常用,但可以帮我们理解JSP
注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6513394762370777604/ 1.<JSP页面实际上就是Servlet> 2.<JSP页 ...
- iview 按需引入解决加载慢的问题
如果出现加载2s以上的情况请先查看服务器是否对大文件进行过压缩优化处理. 按照官方文档把iview引入到vue的项目中,全部引入的时候没问题.当按官方文档显示的按需加载是借助插件babel-plugi ...
- 纯手画WinForm的Alert提示弹出框
纯手画WinForm的Alert弹框 一.窗体设置 设置以下属性: 属性名 属性值 说明 AutoScaleMode None 确定屏幕分辨率或字体更改时窗体如何缩放 BackColor 103, 1 ...
- ASCII、Unicode和UTF-8等常见字符编码格式介绍
信息存储在计算机中是转换成二进制来存储的,二进制的发明据说是来源于中国阴阳八卦.后德国数理哲学大师莱布尼茨是最早接触中华文化的欧洲人之一,从他的传教士朋友鲍威特寄给他的拉丁文译本<易经>中 ...
- JAVA主要类集分类
包装类 Integer包装类 方法 返回值 功能描述 byteValue() byte 以 byte 类型返回该 Integer 的值 intValue() int 以 int 型返回此 Intege ...