本指南引導您完成使用Spring Data Redis發布和訂閱通過Redis發送的消息的過程。Messaging with Redis
1. 我們將構建什么?
您將構建一個使用StringRedisTemplate發布字符串消息的應用程序,並使用MessageListenerAdapter為其提供POJO訂閱。
使用Spring Data Redis作為發布消息的手段可能聽起來很奇怪,但正如您將發現的那樣,Redis不僅提供了NoSQL數據存儲,還提供了消息傳遞系統。
2. 我們需要准備什么?
-
大約十五分鍾
-
一個喜歡的文本編輯器或者IDE
-
JDK 1.8 或者更高
-
你也可以導入代碼到你的IDE中
-
-
Redis server
-
3. 如何完成這個指南?
像大多數Spring入門指南一樣,您可以從頭開始並完成每個步驟,也可以繞過已熟悉的基本設置步驟。 無論哪種方式,你最終得到工作代碼。
為了兼顧無法使用Intellij Idea 的讀者,我這里依然采用STS來完成這個指南。
1. 打開我們的STS ,New ————> Import Spring Getting Started Content
2. 輸入message, 搜索找到Message Redis
Tips: Code Sets 我們仍然全部勾選,這樣系統默認會生成一個已經寫好的complete 項目,這樣方便我們在Initial項目中模仿學習。
3. 搭建Redis 服務器
在構建消息傳遞應用程序之前,您需要設置將處理接收和發送消息的服務器。
Redis是一個開源的BSD許可的鍵值數據存儲器,它還附帶了一個消息傳遞系統。
3.1 在Windows 操作系統安裝Redis
關於Redis 在windows 上的安裝詳情可參考我的另外一篇博文: 揭開Redis的神秘面紗
3.2 啟動Redis 服務器
下載安裝好后,你如果沒有配置環境變量需要先進入Redis 安裝文件夾
比如我們的安裝在C:\app\Redis\Redis-x64-3.2.100 那么我們打開命令行窗口后,執行以下命令進入安裝文件夾:
C:\app\Redis\Redis-x64-3.2.100
Tips: 如果已經配置了環境變量可以跳過上述步驟
然后我們執行啟動Redis 服務器命令
redis-serve
執行成功后你會看到下面圖示的內容:
Tips: 如果看到上述內容,說明服務器啟動成功,端口監聽在6379端口
4. 創建一個Redis消息接收器
在任何基於消息傳遞的應用程序中,都有消息發布者和消息接收者。 要創建消息接收方,請使用一種方法來實現接收方以響應消息:
src/main/java/hello/Receiver.java
package hello; import java.util.concurrent.CountDownLatch; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; public class Receiver { private static final Logger LOGGER=LoggerFactory.getLogger(Receiver.class); private CountDownLatch latch; @Autowired public Receiver(CountDownLatch latch) { this.latch=latch; } public void receiveMessage(String message) { LOGGER.info("Received <" +message+">"); latch.countDown(); } }
Receiver是一個簡單的POJO,它定義了一種接收消息的方法。 正如您將Receiver注冊為消息偵聽器時所看到的,您可以根據需要命名消息處理方法。
出於演示的目的,它的構造函數使用倒計數鎖存器進行自動裝配。 這樣,它可以在收到消息時發出信號。
5. 注冊偵聽器並發送消息
Spring Data Redis提供了使用Redis發送和接收消息所需的所有組件。 具體來說,你需要配置:
- 連接工廠
- 消息偵聽器容器
- Redis模板
您將使用Redis模板發送消息,並且您將向Receiver注冊消息偵聽器容器,以便它可以接收消息。 連接工廠驅動模板和消息偵聽器容器,使它們能夠連接到Redis服務器。
本示例使用Spring Boot的默認RedisConnectionFactory,它是基於Jedis Redis庫的JedisConnectionFactory的一個實例。 連接工廠被注入到消息監聽器容器和Redis模板中。
src/main/java/hello/Application.java
package hello; import java.util.concurrent.CountDownLatch; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.listener.PatternTopic; import org.springframework.data.redis.listener.RedisMessageListenerContainer; import org.springframework.data.redis.listener.adapter.MessageListenerAdapter; @SpringBootApplication public class Application { private static final Logger LOGGER=LoggerFactory.getLogger(Application.class); @Bean RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,MessageListenerAdapter listenerAdapter) { RedisMessageListenerContainer container=new RedisMessageListenerContainer(); container.setConnectionFactory(connectionFactory); container.addMessageListener(listenerAdapter,new PatternTopic("chat")); return container; } @Bean MessageListenerAdapter listenerAdapter(Receiver receiver) { return new MessageListenerAdapter(receiver,"receiveMessage"); } @Bean Receiver receiver(CountDownLatch latch) { return new Receiver(latch); } @Bean CountDownLatch latch() { return new CountDownLatch(1); } @Bean StringRedisTemplate template(RedisConnectionFactory connectionFactory) { return new StringRedisTemplate(connectionFactory); } public static void main(String[] args)throws InterruptedException{ ApplicationContext ctx=SpringApplication.run(Application.class,args); StringRedisTemplate template=ctx.getBean(StringRedisTemplate.class); CountDownLatch latch = ctx.getBean(CountDownLatch.class); LOGGER.info("Sending message..."); template.convertAndSend("chat", "Hello from Redis!"); latch.await(); System.exit(0); } }
在listenerAdapter方法中定義的bean在容器中定義的消息偵聽器容器中注冊為消息偵聽器,並將偵聽“chat”主題上的消息。
由於Receiver類是POJO,因此需要將其包裝在實現AddMessageListener()所需的MessageListener接口的消息偵聽器適配器中。
消息偵聽器適配器還配置為在消息到達時調用Receiver上的receiveMessage()方法。
連接工廠和消息監聽器容器bean都是您需要偵聽消息的。
要發送消息,您還需要一個Redis模板。在這里,它是一個配置為StringRedisTemplate的bean,它是RedisTemplate的一個實現,它着重於Redis的常用用法,其中鍵和值都是`String`s。
main()方法通過創建Spring應用程序上下文來解決所有問題。應用程序上下文然后啟動消息監聽器容器,並且消息監聽器容器bean開始監聽消息。然后,main()方法從應用程序上下文中檢索StringRedisTemplate bean,並使用它發送“來自Redis的Hello!”消息在“chat”主題上。最后,它關閉Spring應用程序上下文並結束應用程序。
6. 編譯成可執行Jar
您可以使用Gradle或Maven從命令行運行應用程序。 或者您可以構建一個包含所有必需的依賴項,類和資源的可執行JAR文件,並運行該文件。 這使得在整個開發生命周期內跨越不同環境等,將服務作為應用程序發布,版本化和部署變得非常容易。
生成Jar
如果您正在使用Gradle,則可以使用./gradlew bootRun運行該應用程序。 或者您可以使用./gradlew構建構建JAR文件。 然后你可以運行JAR文件:
java -jar build/libs/gs-messaging-redis-0.1.0.jar
如果您使用的是Maven,則可以使用./mvn spring-boot:run來運行該應用程序。 或者您可以使用./mvn clean包構建JAR文件。 然后你可以運行JAR文件:
java -jar target/gs-messaging-redis-0.1.0.jar
上述過程將創建一個可運行的JAR。 您也可以選擇構建經典的WAR文件。
7. 執行成功后你將看到下面的信息:
恭喜! 您剛剛使用Spring和Redis開發了一個簡單的發布和訂閱應用程序。
源碼:點擊查看