原题目: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 https://github.com/spring-gui…
光盘进入 gs-messaging-rabbitmq/initial
跳转到从 Spring Initializr 开始。
实现后,您能够对照中的代码查看后果
gs-messaging-rabbitmq/complete。
设置 RabbitMQ 代理
在构建消息传递应用程序之前,您须要设置一个服务器来解决接管和发送音讯。
RabbitMQ 是一个 AMQP 服务器。该服务器可在
https://www.rabbitmq.com/down… 收费取得。您能够手动下载它,或者,如果您应用带有 Homebrew 的 Mac,则能够在终端窗口中运行以下命令:
brew install rabbitmq
通过在终端窗口中运行以下命令,解压缩服务器并应用默认设置启动它:
rabbitmq-server
您应该会看到相似于以下内容的输入:
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/rabbit@localhost.log
/usr/local/var/log/rabbitmq/rabbit@localhost-sasl.log
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 文件。此我的项目配置为适宜本教程中的示例。
手动初始化我的项目:
导航到 https://start.spring.io。该服务提取应用程序所需的所有依赖项,并为您实现大部分设置。
抉择 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;
@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,它定义了接管音讯的办法。当您注册它以接管音讯时,您能够将其命名为任何您想要的名称。
为了不便起见,这个 POJO 也有一个 CountDownLatch. 这让它收回已收到音讯的信号。这是您不太可能在生产应用程序中实现的货色。
注册监听器并发送音讯
Spring AMQPRabbitTemplate 提供了应用 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;
@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 是一个不便的正文,它增加了以下所有内容:
@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,您不用解决任何管道或基础设施的配置。
办法中定义的 beanlistenerAdapter()被注册为容器中的音讯监听器(定义在 中 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;
@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 请留神,模板应用与绑定匹配的路由键将音讯路由到交换器。
在测试中,您能够模仿运行器,以便能够独自测试接收器。
运行应用程序
该 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 做比这里更多的事件,但本指南应该提供一个良好的开始。