译:9.使用Redis进行消息传递
本指南引導(dǎo)您完成使用Spring Data Redis發(fā)布和訂閱通過Redis發(fā)送的消息的過程。Messaging with Redis
1.?我們將構(gòu)建什么?
您將構(gòu)建一個使用StringRedisTemplate發(fā)布字符串消息的應(yīng)用程序,并使用MessageListenerAdapter為其提供POJO訂閱。
使用Spring Data Redis作為發(fā)布消息的手段可能聽起來很奇怪,但正如您將發(fā)現(xiàn)的那樣,Redis不僅提供了NoSQL數(shù)據(jù)存儲,還提供了消息傳遞系統(tǒng)。
?2.?我們需要準備什么?
-
大約十五分鐘
-
一個喜歡的文本編輯器或者IDE
-
JDK 1.8?或者更高
-
Gradle 4+?或者?Maven 3.2+
-
你也可以導(dǎo)入代碼到你的IDE中
-
Spring Tool Suite (STS)
-
IntelliJ IDEA
-
Redis server?
-
-
3.? 如何完成這個指南?
?像大多數(shù)Spring入門指南一樣,您可以從頭開始并完成每個步驟,也可以繞過已熟悉的基本設(shè)置步驟。 無論哪種方式,你最終得到工作代碼。
為了兼顧無法使用Intellij Idea?的讀者,我這里依然采用STS來完成這個指南。
1.?打開我們的STS ,New ————> Import Spring Getting Started Content
2.? 輸入message,?搜索找到Message Redis
Tips: Code Sets?我們?nèi)匀蝗抗催x,這樣系統(tǒng)默認會生成一個已經(jīng)寫好的complete?項目,這樣方便我們在Initial項目中模仿學(xué)習(xí)。
3.? 搭建Redis?服務(wù)器
在構(gòu)建消息傳遞應(yīng)用程序之前,您需要設(shè)置將處理接收和發(fā)送消息的服務(wù)器。
Redis是一個開源的BSD許可的鍵值數(shù)據(jù)存儲器,它還附帶了一個消息傳遞系統(tǒng)。?
3.1 在Windows?操作系統(tǒng)安裝Redis?
關(guān)于Redis?在windows?上的安裝詳情可參考我的另外一篇博文:??揭開Redis的神秘面紗
3.2?啟動Redis?服務(wù)器
下載安裝好后,你如果沒有配置環(huán)境變量需要先進入Redis?安裝文件夾
比如我們的安裝在C:\app\Redis\Redis-x64-3.2.100?那么我們打開命令行窗口后,執(zhí)行以下命令進入安裝文件夾:
C:\app\Redis\Redis-x64-3.2.100?Tips:?如果已經(jīng)配置了環(huán)境變量可以跳過上述步驟
然后我們執(zhí)行啟動Redis?服務(wù)器命令
redis-serve執(zhí)行成功后你會看到下面圖示的內(nèi)容:
Tips:?如果看到上述內(nèi)容,說明服務(wù)器啟動成功,端口監(jiān)聽在6379端口
?4.?創(chuàng)建一個Redis消息接收器
在任何基于消息傳遞的應(yīng)用程序中,都有消息發(fā)布者和消息接收者。 要創(chuàng)建消息接收方,請使用一種方法來實現(xiàn)接收方以響應(yīng)消息:
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;@Autowiredpublic Receiver(CountDownLatch latch) {this.latch=latch;}public void receiveMessage(String message) {LOGGER.info("Received <" +message+">");latch.countDown();} }Receiver是一個簡單的POJO,它定義了一種接收消息的方法。 正如您將Receiver注冊為消息偵聽器時所看到的,您可以根據(jù)需要命名消息處理方法。
出于演示的目的,它的構(gòu)造函數(shù)使用倒計數(shù)鎖存器進行自動裝配。 這樣,它可以在收到消息時發(fā)出信號。
5. 注冊偵聽器并發(fā)送消息
Spring Data Redis提供了使用Redis發(fā)送和接收消息所需的所有組件。 具體來說,你需要配置:
- 連接工廠
- 消息偵聽器容器
- Redis模板
您將使用Redis模板發(fā)送消息,并且您將向Receiver注冊消息偵聽器容器,以便它可以接收消息。 連接工廠驅(qū)動模板和消息偵聽器容器,使它們能夠連接到Redis服務(wù)器。
本示例使用Spring Boot的默認RedisConnectionFactory,它是基于Jedis Redis庫的JedisConnectionFactory的一個實例。 連接工廠被注入到消息監(jiān)聽器容器和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);@BeanRedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,MessageListenerAdapter listenerAdapter) {RedisMessageListenerContainer container=new RedisMessageListenerContainer();container.setConnectionFactory(connectionFactory);container.addMessageListener(listenerAdapter,new PatternTopic("chat"));return container;}@BeanMessageListenerAdapter listenerAdapter(Receiver receiver) {return new MessageListenerAdapter(receiver,"receiveMessage");}@BeanReceiver receiver(CountDownLatch latch) {return new Receiver(latch);}@BeanCountDownLatch latch() {return new CountDownLatch(1);}@BeanStringRedisTemplate 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,因此需要將其包裝在實現(xiàn)AddMessageListener()所需的MessageListener接口的消息偵聽器適配器中。
消息偵聽器適配器還配置為在消息到達時調(diào)用Receiver上的receiveMessage()方法。
連接工廠和消息監(jiān)聽器容器bean都是您需要偵聽消息的。
要發(fā)送消息,您還需要一個Redis模板。在這里,它是一個配置為StringRedisTemplate的bean,它是RedisTemplate的一個實現(xiàn),它著重于Redis的常用用法,其中鍵和值都是`String`s。
main()方法通過創(chuàng)建Spring應(yīng)用程序上下文來解決所有問題。應(yīng)用程序上下文然后啟動消息監(jiān)聽器容器,并且消息監(jiān)聽器容器bean開始監(jiān)聽消息。然后,main()方法從應(yīng)用程序上下文中檢索StringRedisTemplate bean,并使用它發(fā)送“來自Redis的Hello!”消息在“chat”主題上。最后,它關(guān)閉Spring應(yīng)用程序上下文并結(jié)束應(yīng)用程序。
6.?編譯成可執(zhí)行Jar
您可以使用Gradle或Maven從命令行運行應(yīng)用程序。 或者您可以構(gòu)建一個包含所有必需的依賴項,類和資源的可執(zhí)行JAR文件,并運行該文件。 這使得在整個開發(fā)生命周期內(nèi)跨越不同環(huán)境等,將服務(wù)作為應(yīng)用程序發(fā)布,版本化和部署變得非常容易。
生成Jar?
如果您正在使用Gradle,則可以使用./gradlew bootRun運行該應(yīng)用程序。 或者您可以使用./gradlew構(gòu)建構(gòu)建JAR文件。 然后你可以運行JAR文件:
java -jar build/libs/gs-messaging-redis-0.1.0.jar如果您使用的是Maven,則可以使用./mvn spring-boot:run來運行該應(yīng)用程序。 或者您可以使用./mvn clean包構(gòu)建JAR文件。 然后你可以運行JAR文件:
java -jar target/gs-messaging-redis-0.1.0.jar上述過程將創(chuàng)建一個可運行的JAR。 您也可以選擇構(gòu)建經(jīng)典的WAR文件。
7. 執(zhí)行成功后你將看到下面的信息:
?恭喜! 您剛剛使用Spring和Redis開發(fā)了一個簡單的發(fā)布和訂閱應(yīng)用程序。
源碼:點擊查看
轉(zhuǎn)載于:https://www.cnblogs.com/xingyunblog/p/9128568.html
總結(jié)
以上是生活随笔為你收集整理的译:9.使用Redis进行消息传递的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL 性能调优之存储引擎
- 下一篇: tensorflow-eagerAPI