redis实现简单的消息发布/订阅模式。
消息订阅者:
package org.common.component; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.connection.Message; import org.springframework.data.redis.connection.MessageListener; import org.springframework.data.redis.core.RedisTemplate; public class RedisMessageListener implements MessageListener { @Autowired private RedisTemplate<String, Object> redisTemplate; private static final Logger logger = LoggerFactory.getLogger(RedisMessageListener.class); @Override public void onMessage(Message message, byte[] pattern) { logger.info("channel:{}",new String(message.getChannel())); logger.info("topic:{}",(String)redisTemplate.getValueSerializer().deserialize(message.getBody())); } }
xml配置:
<bean id="redisMessageListener" class="org.common.component.RedisMessageListener" /> <bean id="messageListener" class="org.springframework.data.redis.listener.adapter.MessageListenerAdapter"> <constructor-arg> <ref bean="redisMessageListener"/> </constructor-arg> </bean> <bean id="redisContainer" class="org.springframework.data.redis.listener.RedisMessageListenerContainer"> <property name="connectionFactory" ref="jedisConnectionFactory" /> <property name="messageListeners"> <map> <entry key-ref="messageListener"> <list> <bean class="org.springframework.data.redis.listener.ChannelTopic"> <constructor-arg value="chargeRequest" /> </bean> <!-- <bean class="org.springframework.data.redis.listener.PatternTopic"> <constructor-arg value="hello*" /> </bean> <bean class="org.springframework.data.redis.listener.PatternTopic"> <constructor-arg value="tv*" /> </bean> --> </list> </entry> </map> </property> </bean>
消息发布可以使用redisTemplate.convertAndSend("", "");
或者在安装的redis客户端使用命令发布:
结果为 (integer) 0表示没有订阅者,消息立即失效。
网上写的很多都不太靠谱,这个实测通过。