瞭解如何使用 Spring 和 RabbitMQ 建立一個簡單的釋出和訂閱應用程式

Adobe國際認證發表於2022-02-10

原標題:Spring認證中國教育管理中心- 瞭解如何使用 Spring 和 RabbitMQ 建立一個簡單的釋出和訂閱應用程式。(內容來源:Spring中國教育管理中心)

如何使用 Spring 和 RabbitMQ 建立一個簡單的釋出和訂閱應用程式?

本指南將引導您完成設定釋出和訂閱訊息的 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 檔案。此專案配置為適合本教程中的示例。

手動初始化專案:

  1. 導航到。該服務提取應用程式所需的所有依賴項,併為您完成大部分設定。
  2. 選擇 Gradle 或 Maven 以及您要使用的語言。本指南假定您選擇了 Java。
  3. 單擊 Dependencies併為 RabbitMQ 選擇 Spring
  4. 單擊 生成
  5. 下載生成的 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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章