瞭解如何使用 Spring 和 RabbitMQ 建立一個簡單的釋出和訂閱應用程式
原標題:Spring認證中國教育管理中心- 瞭解如何使用 Spring 和 RabbitMQ 建立一個簡單的釋出和訂閱應用程式。(內容來源:Spring中國教育管理中心)
本指南將引導您完成設定釋出和訂閱訊息的 RabbitMQ AMQP 伺服器以及建立 Spring Boot 應用程式以與該 RabbitMQ 伺服器互動的過程。
你將建造什麼
您將構建一個應用程式,該應用程式使用 Spring AMQP 釋出訊息 RabbitTemplate並使用 MessageListenerAdapter.
你需要什麼
- 約15分鐘
- 最喜歡的文字編輯器或 IDE
- JDK 11或更高版本
- Gradle 4+或Maven 3.2+
- 您還可以將程式碼直接匯入 IDE:彈簧工具套件 (STS)IntelliJ IDEA設定 RabbitMQ 伺服器。請參閱設定 RabbitMQ 代理。
如何完成本指南
像大多數 Spring入門指南一樣,您可以從頭開始並完成每個步驟,也可以繞過您已經熟悉的基本設定步驟。無論哪種方式,您最終都會得到工作程式碼。
要 從頭開始,請繼續設定 RabbitMQ 代理。
要 跳過基礎知識,請執行以下操作:
- 下載並解壓本指南的原始碼庫,或使用Git克隆它: git clone
- 光碟進入 gs-messaging-rabbitmq/initial
- 跳轉到從 Spring Initializr 開始。
完成後,您可以對照中的程式碼檢查結果
gs-messaging-rabbitmq/complete。
設定 RabbitMQ 代理
在構建訊息傳遞應用程式之前,您需要設定一個伺服器來處理接收和傳送訊息。
RabbitMQ 是一個 AMQP 伺服器。該伺服器可在
免費獲得。您可以手動下載它,或者,如果您使用帶有 Homebrew 的 Mac,則可以在終端視窗中執行以下命令:
brew install rabbitmq
透過在終端視窗中執行以下命令,解壓縮伺服器並使用預設設定啟動它:
rabbitmq-server
您應該會看到類似於以下內容的輸出:
RabbitMQ 3.1.3. Copyright (C) 2007-2013 VMware, Inc.## ## Licensed under the MPL. See Starting broker... completed with 6 plugins.
如果您在本地執行 Docker,您還可以使用Docker Compose快速啟動 RabbitMQ 伺服器。Github 專案 docker-compose.yml的根目錄中有一個。 complete這非常簡單,如下面的清單所示:
rabbitmq: image: rabbitmq:management ports: - "5672:5672" - "15672:15672"
使用當前目錄中的此檔案,您可以執行 docker-compose up以使 RabbitMQ 在容器中執行。
從 Spring Initializr 開始
您可以使用這個預先初始化的專案並單擊 Generate 下載 ZIP 檔案。此專案配置為適合本教程中的示例。
手動初始化專案:
- 導航到。該服務提取應用程式所需的所有依賴項,併為您完成大部分設定。
- 選擇 Gradle 或 Maven 以及您要使用的語言。本指南假定您選擇了 Java。
- 單擊 Dependencies併為 RabbitMQ 選擇 Spring。
- 單擊 生成。
- 下載生成的 ZIP 檔案,該檔案是根據您的選擇配置的 Web 應用程式的存檔。
如果您的 IDE 具有 Spring Initializr 整合,您可以從您的 IDE 完成此過程。
你也可以從 Github 上 fork 專案並在你的 IDE 或其他編輯器中開啟它。
建立 RabbitMQ 訊息接收器
對於任何基於訊息傳遞的應用程式,您都需要建立一個響應已釋出訊息的接收器。以下清單(來自
src/main/java/com.example.messagingrabbitmq/Receiver.java)顯示瞭如何執行此操作:
package com.example.messagingrabbitmq;import java.util.concurrent.CountDownLatch;import org.springframework.stereotype.Component;@Componentpublic class Receiver { private CountDownLatch latch = new CountDownLatch(1); public void receiveMessage(String message) { System.out.println("Received <" + message + ">"); latch.countDown(); } public CountDownLatch getLatch() { return latch; } }
這 Receiver是一個 POJO,它定義了接收訊息的方法。當您註冊它以接收訊息時,您可以將其命名為任何您想要的名稱。
為了方便起見,這個 POJO 也有一個CountDownLatch. 這讓它發出已收到訊息的訊號。這是您不太可能在生產應用程式中實現的東西。
註冊監聽器併傳送訊息
Spring AMQP RabbitTemplate提供了使用 RabbitMQ 傳送和接收訊息所需的一切。但是,您需要:
- 配置訊息偵聽器容器。
- 宣告佇列、交換器以及它們之間的繫結。
- 配置一個元件傳送一些訊息來測試監聽器。
Spring Boot 會自動建立連線工廠和 RabbitTemplate,從而減少您必須編寫的程式碼量。
您將使用
RabbitTemplate來傳送訊息,並且您將
Receiver使用訊息偵聽器容器註冊一個以接收訊息。連線工廠驅動兩者,讓它們連線到 RabbitMQ 伺服器。以下清單(來自
src/main/java/com.example.messagingrabbitmq/MessagingRabbitApplication.java)顯示瞭如何建立應用程式類:
package com.example.messagingrabbitmq;import org.springframework.amqp.core.Binding;import org.springframework.amqp.core.BindingBuilder;import org.springframework.amqp.core.Queue;import org.springframework.amqp.core.TopicExchange;import org.springframework.amqp.rabbit.connection.ConnectionFactory;import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer;import org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.context.annotation.Bean;@SpringBootApplicationpublic class MessagingRabbitmqApplication { static final String topicExchangeName = "spring-boot-exchange"; static final String queueName = "spring-boot"; @Bean Queue queue() { return new Queue(queueName, false); } @Bean TopicExchange exchange() { return new TopicExchange(topicExchangeName); } @Bean Binding binding(Queue queue, TopicExchange exchange) { return BindingBuilder.bind(queue).to(exchange).with("foo.bar.#"); } @Bean SimpleMessageListenerContainer container(ConnectionFactory connectionFactory, MessageListenerAdapter listenerAdapter) { SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(); container.setConnectionFactory(connectionFactory); container.setQueueNames(queueName); container.setMessageListener(listenerAdapter); return container; } @Bean MessageListenerAdapter listenerAdapter(Receiver receiver) { return new MessageListenerAdapter(receiver, "receiveMessage"); } public static void main(String[] args) throws InterruptedException { SpringApplication.run(MessagingRabbitmqApplication.class, args).close(); } }
@SpringBootApplication是一個方便的註釋,它新增了以下所有內容:
- @Configuration: 將類標記為應用程式上下文的 bean 定義源。
- @EnableAutoConfiguration:告訴 Spring Boot 根據類路徑設定、其他 bean 和各種屬性設定開始新增 bean。例如,如果 spring-webmvc位於類路徑上,則此註釋將應用程式標記為 Web 應用程式並啟用關鍵行為,例如設定 DispatcherServlet.
- @ComponentScan: 告訴 Spring 在包中查詢其他元件、配置和服務 com/example,讓它找到控制器。
該 main()方法使用 Spring Boot 的 SpringApplication.run()方法來啟動應用程式。您是否注意到沒有一行 XML?也沒有 web.xml檔案。這個 Web 應用程式是 100% 純 Java,您不必處理任何管道或基礎設施的配置。
方法中定義的 bean listenerAdapter()被註冊為容器中的訊息監聽器(定義在 中 container())。它偵聽 spring-boot佇列中的訊息。因為 Receiver該類是 POJO,所以需要將其包裝在 中 MessageListenerAdapter,您可以在其中指定它呼叫 receiveMessage.
JMS 佇列和 AMQP 佇列具有不同的語義。例如,JMS 僅將排隊的訊息傳送給一個消費者。雖然 AMQP 佇列做同樣的事情,但 AMQP 生產者並不直接將訊息傳送到佇列。相反,一條訊息被髮送到一個交換器,該交換器可以傳送到單個佇列或扇出到多個佇列,模擬 JMS 主題的概念。
訊息偵聽器容器和接收器 bean 是您偵聽訊息所需的全部內容。要傳送訊息,您還需要一個 Rabbit 模板。
該queue()方法建立一個 AMQP 佇列。該exchange()方法建立主題交換。該方法將這兩者繫結在一起,定義釋出到交換binding()時發生的行為。RabbitTemplate
Spring AMQP 要求將Queue、TopicExchange和Binding宣告為頂級 Spring bean 以便正確設定。
在這種情況下,我們使用主題交換,並且佇列與路由鍵繫結 foo.bar.#,這意味著以 開頭的路由鍵傳送的任何訊息都會 foo.bar.被路由到佇列。
傳送測試訊息
在此示例中,測試訊息由 a 傳送
CommandLineRunner,它還等待接收器中的閂鎖並關閉應用程式上下文。以下清單(來自
src/main/java/com.example.messagingrabbitmq/Runner.java)顯示了它是如何工作的:
package com.example.messagingrabbitmq;import java.util.concurrent.TimeUnit;import org.springframework.amqp.rabbit.core.RabbitTemplate;import org.springframework.boot.CommandLineRunner;import org.springframework.stereotype.Component;@Componentpublic class Runner implements CommandLineRunner { private final RabbitTemplate rabbitTemplate; private final Receiver receiver; public Runner(Receiver receiver, RabbitTemplate rabbitTemplate) { this.receiver = receiver; this.rabbitTemplate = rabbitTemplate; } @Override public void run(String... args) throws Exception { System.out.println("Sending message..."); rabbitTemplate.convertAndSend(MessagingRabbitmqApplication.topicExchangeName, "foo.bar.baz", "Hello from RabbitMQ!"); receiver.getLatch().await(10000, TimeUnit.MILLISECONDS); } }
foo.bar.baz請注意,模板使用與繫結匹配的路由鍵將訊息路由到交換器。
在測試中,您可以模擬執行器,以便可以單獨測試接收器。
執行應用程式
該 main()方法透過建立 Spring 應用程式上下文來啟動該過程。這將啟動訊息偵聽器容器,該容器開始偵聽訊息。有一個 Runnerbean,然後會自動執行。它從應用程式上下文中檢索並在佇列 RabbitTemplate中傳送 Hello from RabbitMQ!訊息。 spring-boot最後,它關閉 Spring 應用程式上下文,應用程式結束。
構建一個可執行的 JAR
您可以使用 Gradle 或 Maven 從命令列執行應用程式。您還可以構建一個包含所有必要依賴項、類和資源的單個可執行 JAR 檔案並執行它。構建可執行 jar 可以在整個開發生命週期、跨不同環境等中輕鬆地將服務作為應用程式交付、版本化和部署。
如果您使用 Gradle,則可以使用 ./gradlew bootRun. 或者,您可以使用構建 JAR 檔案 ./gradlew build,然後執行 JAR 檔案,如下所示:
java -jar build/libs/gs-messaging-rabbitmq-0.1.0.jar
如果您使用 Maven,則可以使用 ./mvnw spring-boot:run. 或者,您可以使用構建 JAR 檔案, ./mvnw clean package然後執行該 JAR 檔案,如下所示:
java -jar 目標/gs-messaging-rabbitmq-0.1.0.jar
此處描述的步驟建立了一個可執行的 JAR。您還可以構建經典的 WAR 檔案。
您應該看到以下輸出:
Sending message... Received <Hello from RabbitMQ!>複製
總結
恭喜!您剛剛使用 Spring 和 RabbitMQ 開發了一個簡單的釋出和訂閱應用程式。您可以使用Spring 和 RabbitMQ做比這裡更多的事情,但本指南應該提供一個良好的開端。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69981720/viewspace-2855175/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 用C++編寫一個簡單的釋出者和訂閱者C++
- 如何實現一個簡單的釋出訂閱模式模式
- 簡單的寫一個釋出訂閱器
- 瞭解釋出訂閱模式之後,vue響應式原理竟如此簡單!模式Vue
- RabbitMQ 入門 - 釋出 / 訂閱MQ
- mqtt訂閱和釋出MQQT
- 【10分鐘帶你瞭解釋出訂閱和觀察者模式】模式
- LightDB訂閱和釋出
- Redis的訊息釋出和訂閱Redis
- js 實現簡單釋出訂閱模式JS模式
- Spring 中的釋出-訂閱模式Spring模式
- 使用Spring Data Redis 釋出訂閱訊息SpringRedis
- spring boot 使用redis進行釋出訂閱Spring BootRedis
- 使用Spring Data Redis 實現訂閱/釋出SpringRedis
- 如何用TypeScript來建立一個簡單的Web應用TypeScriptWeb
- 手寫一個node中的釋出訂閱
- RabbitMQ系列(二)深入瞭解RabbitMQ工作原理及簡單使用MQ
- 觀察者模式和釋出訂閱模式(上)模式
- 個人學習系列 - Spring Boot 配合 Redis 實現簡單的釋出訂閱功能Spring BootRedis
- RabbitMQ學習之(一)_初步瞭解RabbitMQ、RabbitMQ的使用流程、為什麼要使用RabbitMQ、RabbitMQ的應用場景MQ
- Spring Cloud Bus中的事件的訂閱與釋出(一)SpringCloud事件
- 如何使用程式碼建立和讀取 SAP CRM 訂單的 Text 資料
- 使用SlashDB,Go和Vue構建一個簡單的時間表應用程式GoVue
- 輕鬆上手 PHP + RabbitMQ 訊息釋出與訂閱PHPMQ
- 快應用簡單瞭解
- QNX的PPS功能-釋出和訂閱PPS
- ROS2學習之旅(14)——編寫簡單的釋出者和訂閱者(C++)ROSC++
- 用 Vue 建立一個簡單的 electron 桌面應用Vue
- 談談觀察者模式和釋出訂閱模式模式
- javascript(js) 觀察者模式和釋出訂閱模式JavaScriptJS模式
- Zookeeper應用場景之【資料釋出/訂閱】
- 直播app開發,實現簡單的釋出訂閱者模式APP模式
- 直播平臺開發中,策略模式和釋出訂閱模式的使用模式
- Redis的釋出訂閱Redis
- RabbitMQ系列教程之三:釋出/訂閱(Publish/Subscribe)MQ
- 基於Redis訊息的訂閱釋出應用場景Redis
- 使用 Vue.js 和 Iris 共建一個簡單的 Todo MVC 應用Vue.jsMVC
- Spring Boot 之路(一):一個簡單的Spring Boot應用Spring Boot