銀行卡消費(fèi)的時(shí)候,銀行往往會通過微信、短信或郵件通知用戶交易的詳細(xì)信息,這便是發(fā)布訂閱模式。
我們可以使用下面的命令進(jìn)行模擬
創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),福貢企業(yè)網(wǎng)站建設(shè),福貢品牌網(wǎng)站建設(shè),網(wǎng)站定制,福貢網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,福貢網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
先打開一個(gè)客戶端1,輸入命令
SUBSCRIBE chat
表示客戶端1訂閱一個(gè)名為chat的渠道,之后打開客戶端2,輸入命令
publish chat "Hello World!"
在Spring中,我們自定義接收消息的類,需要實(shí)現(xiàn)MessageListener接口,并實(shí)現(xiàn)接口定義的方法onMessage,代碼如下。
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();
// 使用值序列化器轉(zhuǎn)換
String msgBody = (String)getRt().getValueSerializer().deserialize(body);
System.out.println(msgBody);
// 獲取channel
byte[] channel = message.getChannel();
// 使用字符串序列化器轉(zhuǎn)換
String channelStr = (String)getRt().getStringSerializer().deserialize(channel);
System.out.println(channelStr);
// 渠道名稱轉(zhuǎn)換
String bytesStr = new String(pattern);
System.out.println(bytesStr);
}
}
這里我們沒有使用注解,所以要去spring.xml中注冊bean
<!-- 實(shí)例化類 -->
<bean id="redisMsgListener" class="com.codeliu.transaction.RedisMessageListener">
<property name="rt" ref="redisTemplate"></property>
</bean>
實(shí)例化監(jiān)聽類之后還不行,還得給一個(gè)監(jiān)聽容器,在Spring中對應(yīng)的類為RedisMessageListenerContainer,它可以用來監(jiān)聽Redis的發(fā)布訂閱消息。同樣在Spring.xml中進(jìn)行配置
<!-- 配置監(jiān)聽容器 -->
<bean id="topicContainer" class="org.springframework.data.redis.listener.RedisMessageListenerContainer" destroy-method="destroy">
<!-- redis連接工廠 -->
<property name="connectionFactory" ref="connectionFactory"></property>
<!-- 連接池,只有線程池生存,才能繼續(xù)監(jiān)聽 -->
<property name="taskExecutor">
<bean class="org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler">
<property name="poolSize" value="3"></property>
</bean>
</property>
<!-- 消息監(jiān)聽map -->
<property name="messageListeners">
<map>
<!-- 配置監(jiān)聽者,key-ref與bean id保持一致 -->
<entry key-ref="redisMsgListener">
<!-- 監(jiān)聽類 -->
<bean class="org.springframework.data.redis.listener.ChannelTopic">
<constructor-arg value="chat"></constructor-arg>
</bean>
</entry>
</map>
</property>
</bean>
這里配置了線程池,這個(gè)線程池將會持續(xù)的生存以等待消息傳入,而這里配置了容器用id為redisMsgListener的Bean進(jìn)行渠道chat的監(jiān)聽。當(dāng)消息通過渠道chat方法的時(shí)候,就會使用id為redisMsgListener的Bean處理消息。
下面進(jìn)行測試
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
RedisTemplate rt = applicationContext.getBean(RedisTemplate.class);
String channel = "chat";
// 向渠道chat發(fā)送消息
rt.convertAndSend(channel, "Hello World!");
}
convertAndSend方法就是向指定的渠道發(fā)送消息。
輸出
Hello World!
chat
chat
本文的重點(diǎn)是你有沒有收獲與成長,其余的都不重要,希望讀者們能謹(jǐn)記這一點(diǎn)。同時(shí)我經(jīng)過多年的收藏目前也算收集到了一套完整的學(xué)習(xí)資料,包括但不限于:分布式架構(gòu)、高可擴(kuò)展、高性能、高并發(fā)、Jvm性能調(diào)優(yōu)、Spring,MyBatis,Nginx源碼分析,Redis,ActiveMQ、、Mycat、Netty、Kafka、MySQL、Zookeeper、Tomcat、Docker、Dubbo、Nginx等多個(gè)知識點(diǎn)高級進(jìn)階干貨,希望對想成為架構(gòu)師的朋友有一定的參考和幫助
網(wǎng)頁標(biāo)題:Redis必知必會——發(fā)布訂閱
鏈接URL:http://muchs.cn/article26/jojojg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊、全網(wǎng)營銷推廣、響應(yīng)式網(wǎng)站、營銷型網(wǎng)站建設(shè)、商城網(wǎng)站、虛擬主機(jī)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)