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缓存到期控制开始后就不在运行,项目启动失败,没有任何错误提示,有没有人了解这个的,帮忙指点指点