銀行卡消費的時候,銀行每每會經過微信、短信或郵件通知用戶交易的詳細信息,這即是發佈訂閱模式。 咱們能夠使用下面的命令進行模擬redis
先打開一個客戶端1,輸入命令spring
SUBSCRIBE chat
表示客戶端1訂閱一個名爲chat的渠道,以後打開客戶端2,輸入命令微信
publish chat "Hello World!"
在Spring中,咱們自定義接收消息的類,須要實現MessageListener接口,並實現接口定義的方法onMessage,代碼以下。app
public class RedisMessageListener implements MessageListener { @SuppressWarnings("rawtypes") private RedisTemplate rt; @SuppressWarnings("rawtypes") public RedisTemplate getRt() { return rt; } @SuppressWarnings("rawtypes") public void setRt(RedisTemplate rt) { this.rt = rt; } @Override public void onMessage(Message message, byte[] pattern) { // 獲取消息 byte[] body = message.getBody(); // 使用值序列化器轉換 String msgBody = (String)getRt().getValueSerializer().deserialize(body); System.out.println(msgBody); // 獲取channel byte[] channel = message.getChannel(); // 使用字符串序列化器轉換 String channelStr = (String)getRt().getStringSerializer().deserialize(channel); System.out.println(channelStr); // 渠道名稱轉換 String bytesStr = new String(pattern); System.out.println(bytesStr); } }
這裏咱們沒有使用註解,因此要去spring.xml中註冊beanide
<!-- 實例化類 --> <bean id="redisMsgListener" class="com.codeliu.transaction.RedisMessageListener"> <property name="rt" ref="redisTemplate"></property> </bean>
實例化監聽類以後還不行,還得給一個監聽容器,在Spring中對應的類爲RedisMessageListenerContainer,它能夠用來監聽Redis的發佈訂閱消息。一樣在Spring.xml中進行配置測試
<!-- 配置監聽容器 --> <bean id="topicContainer" class="org.springframework.data.redis.listener.RedisMessageListenerContainer" destroy-method="destroy"> <!-- redis鏈接工廠 --> <property name="connectionFactory" ref="connectionFactory"></property> <!-- 鏈接池,只有線程池生存,才能繼續監聽 --> <property name="taskExecutor"> <bean class="org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler"> <property name="poolSize" value="3"></property> </bean> </property> <!-- 消息監聽map --> <property name="messageListeners"> <map> <!-- 配置監聽者,key-ref與bean id保持一致 --> <entry key-ref="redisMsgListener"> <!-- 監聽類 --> <bean class="org.springframework.data.redis.listener.ChannelTopic"> <constructor-arg value="chat"></constructor-arg> </bean> </entry> </map> </property> </bean>
這裏配置了線程池,這個線程池將會持續的生存以等待消息傳入,而這裏配置了容器用id爲redisMsgListener的Bean進行渠道chat的監聽。當消息經過渠道chat方法的時候,就會使用id爲redisMsgListener的Bean處理消息。this
下面進行測試線程
public static void main(String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml"); RedisTemplate rt = applicationContext.getBean(RedisTemplate.class); String channel = "chat"; // 向渠道chat發送消息 rt.convertAndSend(channel, "Hello World!"); }
convertAndSend方法就是向指定的渠道發送消息。code
輸出xml
Hello World! chat chat