我想使用 KeyExpirationEventMessageListener 监听过期事件,但我找不到示例。
有人知道如何使用 Spring boot 1.4.3 和 Spring Data Redis 来做到这一点吗?
我目前正在做这个
JedisPool pool = new JedisPool(new JedisPoolConfig(), "localhost");
this.jedis = pool.getResource();
this.jedis.psubscribe(new JedisPubSub() {
@Override
public void onPMessage(String pattern, String channel, String message) {
System.out.println("onPMessage pattern " + pattern + " " + channel + " " + message);
List<Object> txResults = redisTemplate.execute(new SessionCallback<List<Object>>() {
public List<Object> execute(RedisOperations operations) throws DataAccessException {
operations.multi();
operations.opsForValue().get("val:" + message);
operations.delete("val:" + message);
return operations.exec();
}
});
System.out.println(txResults.get(0));
}
}, "__keyevent@0__:expired");
我想直接使用Spring而不是Jedis。
Regards
不要使用KeyExpirationEventMessageListener
当它触发时RedisKeyExpiredEvent
这会导致失败RedisKeyValueAdapter.onApplicationEvent
.
而是使用RedisMessageListenerContainer
:
@Bean
RedisMessageListenerContainer keyExpirationListenerContainer(RedisConnectionFactory connectionFactory) {
RedisMessageListenerContainer listenerContainer = new RedisMessageListenerContainer();
listenerContainer.setConnectionFactory(connectionFactory);
listenerContainer.addMessageListener((message, pattern) -> {
// event handling comes here
}, new PatternTopic("__keyevent@*__:expired"));
return listenerContainer;
}
RedisMessageListenerContainer
在自己的线程上运行所有通知。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)