【轉】redis 消息隊列發布訂閱模式spring boot實現


 最近做項目的時候寫到一個事件推送的場景。之前的實現方式是起job一直查詢數據庫,看看有沒有最新的消息。這種方式非常的不優雅,反正我是不能忍,由於羡慕本身就依賴redis,剛好redis 也有消息隊列的功能,就簡單的使用redis 來實現這個消息推送。

之前參考網上的例子,發現全部來自一個地方,spring 官方的一個例子,某些打着“非官方例子”的頭號,還是一樣就復制了一下官方的例子,怕是自己都沒搞懂代碼,原封不動的貼上來了,這邊順便提一句國內多數的博客都是相互“借鑒”,有些自己都沒理解就把別人的內容 ctrl c  ctrl v 過來了。這邊我不貼官方的代碼,點這里傳送 官方的例子。順便提一句。CountDownLatch 對象其實跟這個內容是無關的,這點我要提一下,具體功能我不多說,官方例子 是為了讓程序發送到 redis 通道里面的 消息被程序讀取之后 才結束程序 而引入的類。

       不多說 直接上代碼

 

 

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
/**redis 消息處理器*/
@Component
public class MessageReceiver {
 
/**接收消息的方法*/
public void receiveMessage(String message){
System.out.println(message);
}
 
}
 
 
@Configuration
public class RedisConfig {
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
MessageListenerAdapter listenerAdapter) {
 
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
//訂閱了一個叫chat 的通道
container.addMessageListener(listenerAdapter, new PatternTopic("chat"));
//這個container 可以添加多個 messageListener
return container;
}
 
@Bean
MessageListenerAdapter listenerAdapter(MessageReceiver receiver) {
//這個地方 是給messageListenerAdapter 傳入一個消息接受的處理器,利用反射的方法調用“receiveMessage”
//也有好幾個重載方法,這邊默認調用處理器的方法 叫handleMessage 可以自己到源碼里面看
return new MessageListenerAdapter(receiver, "receiveMessage");
}
 
/**redis 讀取內容的template 這邊跟本工程無關,可以不配置*/
@Bean
StringRedisTemplate template(RedisConnectionFactory connectionFactory) {
return new StringRedisTemplate(connectionFactory);
}
}
 來自CODE的代碼片
redisConfig.java

 

 

上面 我把兩個類寫在了一起,第一個類 messageReceiver 注釋上也有說明,里面只有一個方法,就是接收到消息之后 處理,這邊演示我就簡單的將他打印在控制台上。

第二個類就是一些配置,注釋上我想也應該能看明白。

ok 接下里就是啟動程序 看看效果

 

    ok 我用命令 publish 向 chat 通道推送了 helloword (提一下 integer 1 代表的就是 當前訂閱的用戶)

 

    完美在我程序里面也收到這個消息,並且打印在控制台上。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM