redis实现消息发布/订阅

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表示没有订阅者,消息立即失效。

 

网上写的很多都不太靠谱,这个实测通过。

 

posted @ 2017-01-23 09:37  晨羲  阅读(346)  评论(0编辑  收藏  举报