专业挖坑 2017-04-01 02:49 采纳率: 0%
浏览 5892

Java监听redis缓存过期事件

Java调用redis的Sentinel,实现监听缓存到期事件。已有基础代码:
package com.ule.fenxiao.checkout.web.util;

import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import org.apache.log4j.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisNode;
import org.springframework.data.redis.connection.RedisSentinelConfiguration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.listener.ChannelTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.listener.Topic;

@Configuration
public class FxRedisCheckoutSentinel {
public static Logger logger = Logger.getLogger(FxRedisCheckoutSentinel.class.getName());
@Bean
public RedisSentinelConfiguration redisSentinelConfiguration() {
logger.info("redisSentinelConfiguration start...");
RedisSentinelConfiguration redisConfiguration = new RedisSentinelConfiguration();
redisConfiguration.setMaster("checkoutMaster");
redisConfiguration.addSentinel(new RedisNode("172.25.201.72", 6451));
redisConfiguration.addSentinel(new RedisNode("172.25.201.72", 6452));
redisConfiguration.addSentinel(new RedisNode("172.25.201.73", 6415));
redisConfiguration.addSentinel(new RedisNode("172.25.201.73", 6416));
logger.info("redisSentinelConfiguration end...");
return redisConfiguration;
}

@Bean
public JedisConnectionFactory jedisConnectionFactory() {
    logger.info("jedisConnectionFactory start...");
    JedisConnectionFactory jcf = new JedisConnectionFactory(redisSentinelConfiguration());
    logger.info("测试redis:" + jcf.isRedisSentinelAware());//查看是否启用了sentinelConnection
    logger.info("jedisConnectionFactory end...");
    return jcf;
}

@Bean
public StringRedisTemplate template() {
    logger.info("template start...");
    return new StringRedisTemplate(jedisConnectionFactory());
}

@Bean
public KeyExpirsMessageListener kyeExcExpirsMessageListener() {
    logger.info("kyeExcExpirsMessageListener start...");
    KeyExpirsMessageListener keyListener = new KeyExpirsMessageListener();
    keyListener.setRedisTemplate(template());
    logger.info("kyeExcExpirsMessageListener end...");
    return keyListener;
}

@Bean
public RedisMessageListenerContainer redisMessageListenerContainer() {
    logger.info("redisMessageListenerContainer start...");
    RedisMessageListenerContainer topicContainer = new RedisMessageListenerContainer();
    topicContainer.setConnectionFactory(jedisConnectionFactory());
    ExecutorService executor = Executors.newFixedThreadPool(10);
    topicContainer.setTaskExecutor(executor);
    Set<Topic> topicSet = new HashSet<Topic>();
    topicSet.add(new ChannelTopic("_ktyevent@0_:expired"));
    topicContainer.addMessageListener(kyeExcExpirsMessageListener(), topicSet);
    logger.info("redisMessageListenerContainer end...");
    return topicContainer;
}

}

package com.ule.fenxiao.checkout.web.util;

import org.apache.log4j.Logger;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.data.redis.core.RedisTemplate;

public class KeyExpirsMessageListener implements MessageListener{
public static Logger logger = Logger.getLogger(KeyExpirsMessageListener.class.getName());

private RedisTemplate<String, String> redisTemplate;

public void setRedisTemplate(RedisTemplate<String, String> redisTemplate) {
    this.redisTemplate = redisTemplate;
}

@Override
public void onMessage(Message message, byte[] pattern) {
    byte[] body = message.getBody();
    byte[] itemChannel = message.getChannel();
    String itemValue = (String) redisTemplate.getValueSerializer().deserialize(body);
    String itemChannelNew = (String) redisTemplate.getValueSerializer().deserialize(itemChannel);
    logger.info("KeyExpirsMessageListener onMessage:channel["+itemChannelNew+"],message["+itemValue+"]");
}

}

项目启动的时候,在listener中加载
public void redisSentinel() {
log.info("redis缓存到期控制开始:");
new AnnotationConfigApplicationContext(FxRedisCheckoutSentinel.class);
}

启动日志输出redis缓存到期控制开始后就不在运行,项目启动失败,没有任何错误提示,有没有人了解这个的,帮忙指点指点
  • 写回答

1条回答 默认 最新

  • 梦昼初PurpleShell 2017-04-01 06:27
    关注

    首先肯定是看日志的,确定下日志级别是不是开高了,降低日志级别看看异常入职会不会出来,没有日志查不到具体原因的,先要定位问题在哪才能解决

    评论

报告相同问题?

悬赏问题

  • ¥15 如何实验stm32主通道和互补通道独立输出
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题