package com.dobbinsoft.fw.support.mq; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeansException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.data.redis.connection.Message; import org.springframework.data.redis.connection.MessageListener; import java.util.HashMap; public class RedisExpiredListener implements MessageListener, ApplicationContextAware { /** * 客户端监听订阅的topic,当有消息的时候,会触发该方法; * 并不能得到value, 只能得到key。 * 姑且理解为: redis服务在key失效时(或失效后)通知到java服务某个key失效了, 那么在java中不可能得到这个redis-key对应的redis-value。 */ protected HashMap handlerRouter; private static final Logger logger = LoggerFactory.getLogger(RedisExpiredListener.class); @Override public void onMessage(Message message, byte[] bytes) { String expiredKey = message.toString(); // TASK:CODE:VALUE结构 String[] split = expiredKey.split(":"); if (split.length < 2 || !expiredKey.startsWith("TASK:")) { return; } logger.info("[Redis键失效通知] key=" + expiredKey); StringBuilder value = new StringBuilder(); for (int i = 2; i < split.length; i++) { value.append(split[i]); if (i != split.length - 1) { value.append(":"); } } int code = Integer.parseInt(split[1]); DelayedMessageHandler handler = handlerRouter.get(code); if (handler != null) { handler.handle(value.toString()); } } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.handlerRouter = (HashMap) applicationContext.getBean("messageHandleRouter"); } }