最近做項目的時候寫到一個事件推送的場景。之前的實現方式是起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 代表的就是 當前訂閱的用戶)
完美在我程序里面也收到這個消息,並且打印在控制台上。