新聞中心
你將建造什么
您將構(gòu)建一個應(yīng)用程序,該應(yīng)用程序使用 Spring AMQP 發(fā)布消息RabbitTemplate并使用MessageListenerAdapter.

創(chuàng)新互聯(lián)公司為您提適合企業(yè)的網(wǎng)站設(shè)計?讓您的網(wǎng)站在搜索引擎具有高度排名,讓您的網(wǎng)站具備超強的網(wǎng)絡(luò)競爭力!結(jié)合企業(yè)自身,進行網(wǎng)站設(shè)計及把握,最后結(jié)合企業(yè)文化和具體宗旨等,才能創(chuàng)作出一份性化解決方案。從網(wǎng)站策劃到成都網(wǎng)站設(shè)計、做網(wǎng)站, 我們的網(wǎng)頁設(shè)計師為您提供的解決方案。
你需要什么
- 約15分鐘
- 最喜歡的文本編輯器或 IDE
- JDK 11或更高版本
- Gradle 4+或Maven 3.2+
- 您還可以將代碼直接導(dǎo)入 IDE:彈簧工具套件 (STS)IntelliJ IDEA設(shè)置 RabbitMQ 服務(wù)器。請參閱設(shè)置 RabbitMQ 代理。
如何完成本指南
像大多數(shù) Spring入門指南一樣,您可以從頭開始并完成每個步驟,也可以繞過您已經(jīng)熟悉的基本設(shè)置步驟。無論哪種方式,您最終都會得到工作代碼。
要從頭開始,請繼續(xù)設(shè)置 RabbitMQ 代理。
要跳過基礎(chǔ)知識,請執(zhí)行以下操作:
- 下載并解壓本指南的源代碼庫,或使用Git克隆它:git clone https://github.com/spring-guides/gs-messaging-rabbitmq.git
- 光盤進入gs-messaging-rabbitmq/initial
- 跳轉(zhuǎn)到從 Spring Initializr 開始。
完成后,您可以對照中的代碼檢查結(jié)果
gs-messaging-rabbitmq/complete。
設(shè)置 RabbitMQ 代理
在構(gòu)建消息傳遞應(yīng)用程序之前,您需要設(shè)置一個服務(wù)器來處理接收和發(fā)送消息。
RabbitMQ 是一個 AMQP 服務(wù)器。該服務(wù)器可在
https://www.rabbitmq.com/download.html免費獲得。您可以手動下載它,或者,如果您使用帶有 Homebrew 的 Mac,則可以在終端窗口中運行以下命令:
brew install rabbitmq
通過在終端窗口中運行以下命令,解壓縮服務(wù)器并使用默認(rèn)設(shè)置啟動它:
rabbitmq-server
您應(yīng)該會看到類似于以下內(nèi)容的輸出:
RabbitMQ 3.1.3. Copyright (C) 2007-2013 VMware, Inc.
## ## Licensed under the MPL. See https://www.rabbitmq.com/
## ##
########## Logs: /usr/local/var/log/rabbitmq/[email protected]
###### ## /usr/local/var/log/rabbitmq/[email protected]
##########
Starting broker... completed with 6 plugins.
如果您在本地運行 Docker,您還可以使用Docker Compose快速啟動 RabbitMQ 服務(wù)器。Github 項目docker-compose.yml的根目錄中有一個。complete這非常簡單,如下面的清單所示:
rabbitmq:
image: rabbitmq:management
ports:
- "5672:5672"
- "15672:15672"
使用當(dāng)前目錄中的此文件,您可以運行docker-compose up以使 RabbitMQ 在容器中運行。
從 Spring Initializr 開始
您可以使用這個預(yù)先初始化的項目并單擊 Generate 下載 ZIP 文件。此項目配置為適合本教程中的示例。
手動初始化項目:
- 導(dǎo)航到https://start.spring.io。該服務(wù)提取應(yīng)用程序所需的所有依賴項,并為您完成大部分設(shè)置。
- 選擇 Gradle 或 Maven 以及您要使用的語言。本指南假定您選擇了 Java。
- 單擊Dependencies并為 RabbitMQ 選擇Spring。
- 單擊生成。
- 下載生成的 ZIP 文件,該文件是根據(jù)您的選擇配置的 Web 應(yīng)用程序的存檔。
如果您的 IDE 具有 Spring Initializr 集成,您可以從您的 IDE 完成此過程。
你也可以從 Github 上 fork 項目并在你的 IDE 或其他編輯器中打開它。
創(chuàng)建 RabbitMQ 消息接收器
對于任何基于消息傳遞的應(yīng)用程序,您都需要創(chuàng)建一個響應(yīng)已發(fā)布消息的接收器。以下清單(來自
src/main/java/com.example.messagingrabbitmq/Receiver.java)顯示了如何執(zhí)行此操作:
package com.example.messagingrabbitmq;
import java.util.concurrent.CountDownLatch;
import org.springframework.stereotype.Component;
@Component
public 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,它定義了接收消息的方法。當(dāng)您注冊它以接收消息時,您可以將其命名為任何您想要的名稱。
為了方便起見,這個 POJO 也有一個CountDownLatch. 這讓它發(fā)出已收到消息的信號。這是您不太可能在生產(chǎn)應(yīng)用程序中實現(xiàn)的東西。
注冊監(jiān)聽器并發(fā)送消息
Spring AMQPRabbitTemplate提供了使用 RabbitMQ 發(fā)送和接收消息所需的一切。但是,您需要:
- 配置消息偵聽器容器。
- 聲明隊列、交換器以及它們之間的綁定。
- 配置一個組件發(fā)送一些消息來測試監(jiān)聽器。
Spring Boot 會自動創(chuàng)建連接工廠和 RabbitTemplate,從而減少您必須編寫的代碼量。
您將使用RabbitTemplate來發(fā)送消息,并且您將Receiver使用消息偵聽器容器注冊一個以接收消息。連接工廠驅(qū)動兩者,讓它們連接到 RabbitMQ 服務(wù)器。以下清單(來自
src/main/java/com.example.messagingrabbitmq/MessagingRabbitApplication.java)顯示了如何創(chuàng)建應(yīng)用程序類:
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;
@SpringBootApplication
public 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是一個方便的注釋,它添加了以下所有內(nèi)容:
- @Configuration: 將類標(biāo)記為應(yīng)用程序上下文的 bean 定義源。
- @EnableAutoConfiguration:告訴 Spring Boot 根據(jù)類路徑設(shè)置、其他 bean 和各種屬性設(shè)置開始添加 bean。例如,如果spring-webmvc位于類路徑上,則此注釋將應(yīng)用程序標(biāo)記為 Web 應(yīng)用程序并激活關(guān)鍵行為,例如設(shè)置DispatcherServlet.
- @ComponentScan: 告訴 Spring 在包中查找其他組件、配置和服務(wù)com/example,讓它找到控制器。
該main()方法使用 Spring Boot 的SpringApplication.run()方法來啟動應(yīng)用程序。您是否注意到?jīng)]有一行 XML?也沒有web.xml文件。這個 Web 應(yīng)用程序是 100% 純 Java,您不必處理任何管道或基礎(chǔ)設(shè)施的配置。
方法中定義的 beanlistenerAdapter()被注冊為容器中的消息監(jiān)聽器(定義在 中container())。它偵聽spring-boot隊列中的消息。因為Receiver該類是 POJO,所以需要將其包裝在 中MessageListenerAdapter,您可以在其中指定它調(diào)用receiveMessage.
JMS 隊列和 AMQP 隊列具有不同的語義。例如,JMS 僅將排隊的消息發(fā)送給一個消費者。雖然 AMQP 隊列做同樣的事情,但 AMQP 生產(chǎn)者并不直接將消息發(fā)送到隊列。相反,一條消息被發(fā)送到一個交換器,該交換器可以發(fā)送到單個隊列或扇出到多個隊列,模擬 JMS 主題的概念。
消息偵聽器容器和接收器 bean 是您偵聽消息所需的全部內(nèi)容。要發(fā)送消息,您還需要一個 Rabbit 模板。
該queue()方法創(chuàng)建一個 AMQP 隊列。該exchange()方法創(chuàng)建主題交換。該方法將這兩者綁定在一起,定義發(fā)布到交換binding()時發(fā)生的行為。RabbitTemplate
Spring AMQP 要求將Queue、TopicExchange和Binding聲明為頂級 Spring bean 以便正確設(shè)置。
在這種情況下,我們使用主題交換,并且隊列與路由鍵綁定foo.bar.#,這意味著以 開頭的路由鍵發(fā)送的任何消息都會foo.bar.被路由到隊列。
發(fā)送測試消息
在此示例中,測試消息由 a 發(fā)送CommandLineRunner,它還等待接收器中的閂鎖并關(guān)閉應(yīng)用程序上下文。以下清單(來自
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;
@Component
public 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請注意,模板使用與綁定匹配的路由鍵將消息路由到交換器。
在測試中,您可以模擬運行器,以便可以單獨測試接收器。
運行應(yīng)用程序
該main()方法通過創(chuàng)建 Spring 應(yīng)用程序上下文來啟動該過程。這將啟動消息偵聽器容器,該容器開始偵聽消息。有一個Runnerbean,然后會自動運行。它從應(yīng)用程序上下文中檢索并在隊列RabbitTemplate中發(fā)送Hello from RabbitMQ!消息。spring-boot最后,它關(guān)閉 Spring 應(yīng)用程序上下文,應(yīng)用程序結(jié)束。
構(gòu)建一個可執(zhí)行的 JAR
您可以使用 Gradle 或 Maven 從命令行運行應(yīng)用程序。您還可以構(gòu)建一個包含所有必要依賴項、類和資源的單個可執(zhí)行 JAR 文件并運行它。構(gòu)建可執(zhí)行 jar 可以在整個開發(fā)生命周期、跨不同環(huán)境等中輕松地將服務(wù)作為應(yīng)用程序交付、版本化和部署。
如果您使用 Gradle,則可以使用./gradlew bootRun. 或者,您可以使用構(gòu)建 JAR 文件./gradlew build,然后運行 JAR 文件,如下所示:
java -jar build/libs/gs-messaging-rabbitmq-0.1.0.jar
如果您使用 Maven,則可以使用./mvnw spring-boot:run. 或者,您可以使用構(gòu)建 JAR 文件,./mvnw clean package然后運行該 JAR 文件,如下所示:
java -jar 目標(biāo)/gs-messaging-rabbitmq-0.1.0.jar
此處描述的步驟創(chuàng)建了一個可運行的 JAR。您還可以構(gòu)建經(jīng)典的 WAR 文件。
您應(yīng)該看到以下輸出:
Sending message...
Received復(fù)制
總結(jié)
恭喜!您剛剛使用 Spring 和 RabbitMQ 開發(fā)了一個簡單的發(fā)布和訂閱應(yīng)用程序。您可以使用Spring 和 RabbitMQ做比這里更多的事情,但本指南應(yīng)該提供一個良好的開端。
本文名稱:如何使用Spring和RabbitMQ創(chuàng)建一個簡單的發(fā)布和訂閱應(yīng)用程序?
文章路徑:http://fisionsoft.com.cn/article/dphjgeh.html


咨詢
建站咨詢
