您好,登錄后才能下訂單哦!
銀行卡消費的時候,銀行往往會通過微信、短信或郵件通知用戶交易的詳細信息,這便是發布訂閱模式。
我們可以使用下面的命令進行模擬
先打開一個客戶端1,輸入命令
SUBSCRIBE chat
表示客戶端1訂閱一個名為chat的渠道,之后打開客戶端2,輸入命令
publish chat "Hello World!"
在Spring中,我們自定義接收消息的類,需要實現MessageListener接口,并實現接口定義的方法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();
// 使用值序列化器轉換
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中注冊bean
<!-- 實例化類 -->
<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處理消息。
下面進行測試
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方法就是向指定的渠道發送消息。
輸出
Hello World!
chat
chat
本文的重點是你有沒有收獲與成長,其余的都不重要,希望讀者們能謹記這一點。同時我經過多年的收藏目前也算收集到了一套完整的學習資料,包括但不限于:分布式架構、高可擴展、高性能、高并發、Jvm性能調優、Spring,MyBatis,Nginx源碼分析,Redis,ActiveMQ、、Mycat、Netty、Kafka、Mysql、Zookeeper、Tomcat、Docker、Dubbo、Nginx等多個知識點高級進階干貨,希望對想成為架構師的朋友有一定的參考和幫助
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。