Spring Boot + RabbitMQ 示例

x33g5p2x  于2021-10-16 转载在 Spring  
字(5.6k)|赞(0)|评价(0)|浏览(322)

这篇文章是关于如何使用 Spring Boot 应用程序连接 RabbitMQ AMQP 服务器并将消息从应用程序发布到 RabbitMQ 服务器的介绍。

RabbitMQ 是一个消息代理:它接受转发消息。它实现了高级消息队列协议(AMQP)并用 Erlang 编程语言编写。

在继续下一步之前,请确保您已在本地计算机上安装了 RabbitMQ 服务器。

###我们将构建什么

我们将使用 Spring AMQP 的 RabbitTemplate 构建一个发布消息的 Spring Boot 应用程序。

###我们需要什么

JDK 1.8 or later
Spring Boot 2.2.6.RELEASE
Gradle 4+ or Maven 3.2+
RabbitMQ Server 3.8.x
Erlang 22.x
Your favourite IDE:
Spring Tool Suite (STS)
Eclipse
IntelliJ IDEA

需要依赖

以下是设置 Spring Boot + RabbitMQ 所需的基本依赖项,将它们添加到您的 pom.xml 中。
pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.2.6.RELEASE</version>
		<relativePath /> <!-- lookup parent from repository -->
	</parent>
	<groupId>org.websparrow</groupId>
	<artifactId>spring-boot-rabbit-mq</artifactId>
	<version>0.0.1-SNAPSHOT</version>

	<properties>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-amqp</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>		
	</dependencies>
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

项目结构

我们在 STS 4 IDE 中的应用程序的最终项目结构如下所示:

application.properties

application.properties 文件将用于配置 Rabbit MQ 服务器详细信息,如端口、主机、用户名和密码。要发布消息,我们需要设置 AMQP 的交换、队列和路由键详细信息。
application.properties

#RabbitMQ Server properties
spring.rabbitmq.host= localhost
spring.rabbitmq.port= 5672
spring.rabbitmq.username= guest
spring.rabbitmq.password= guest

#AMQP properties
rabbitmq.exchange= websparrow.exchange
rabbitmq.queue= websparrow.queue
rabbitmq.routingKey= websparrow.routing.key

rabbitmq.exchange: 生产者发布消息的交换名称。

rabbitmq.queue: 消费者接收消息的队列名称。

rabbitmq.routingkey: 用于将消息从交换绑定到特定队列。

配置

RabbitMQConfig 类用于为RabbitMQ服务器配置交换和队列,并借助路由密钥将它们绑定在一起。
RabbitMQConfig.java

package org.websparrow.config;

import org.springframework.amqp.*;
import org.springframework.beans.*;
import org.springframework.context.*;
import org.springframework.messaging.*;

@Configuration
public class RabbitMQConfig {

	@Value("${rabbitmq.queue}")
	private String queue;
	@Value("${rabbitmq.exchange}")
	private String exchange;
	@Value("${rabbitmq.routingkey}")
	private String routingKey;

	@Bean
	public TopicExchange getExchangeName() {
		return new TopicExchange(exchange);
	}

	@Bean
	public Queue getQueueName() {
		return new Queue(queue);
	}

	@Bean
	public Binding declareBinding() {
		return BindingBuilder.bind(getQueueName()).to(getExchangeName())
				.with(routingKey);
	}

	@Bean
	public Jackson2JsonMessageConverter getMessageConverter() {
		return new Jackson2JsonMessageConverter();

	}

	@Bean
	public RabbitTemplate rabbitTemplate(final ConnectionFactory factory) {
		final RabbitTemplate rabbitTemplate = new RabbitTemplate(factory);
		rabbitTemplate.setMessageConverter(getMessageConverter());
		return rabbitTemplate;
	}

	@Bean
	public MappingJackson2MessageConverter consumerJackson2MessageConverter() {
		return new MappingJackson2MessageConverter();
	}

	@Bean
	public DefaultMessageHandlerMethodFactory messageHandlerMethodFactory() {
		DefaultMessageHandlerMethodFactory factory = new DefaultMessageHandlerMethodFactory();
		factory.setMessageConverter(consumerJackson2MessageConverter());
		return factory;
	}

	public String getRoutingKey() {
		return routingKey;
	}

	public String getQueue() {
		return queue;
	}

	public String getExchange() {
		return exchange;
	}
}

服务

MessageSender 类将用于使用 RabbitTemplate 将消息从交换发布到队列。
MessageSender.java

package org.websparrow.service;

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Service;

@Service
public class MessageSender {

	public void sendMessage(RabbitTemplate template, String exchange, Object data,
			String key) {

		template.convertAndSend(exchange, key, data);
	}
}

控制器

RabbitMQController 将公开端点以提供需要在 RabbitMQ 服务器上发布的数据。
RabbitMQController.java

package org.websparrow.controller;

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.*;
import org.websparrow.config.RabbitMQConfig;
import org.websparrow.service.MessageSender;

@RestController
public class RabbitMQController {

	@Autowired
	private MessageSender messageSender;
	@Autowired
	private RabbitMQConfig rabbitMQConfig;
	@Autowired
	private RabbitTemplate rabbitTemplate;

	@PostMapping("/send-message")
	public Object sendMessage(@RequestBody String message) {

		messageSender.sendMessage(rabbitTemplate, rabbitMQConfig.getExchange(),
				message, rabbitMQConfig.getRoutingKey());

		return "Message sent <" + message + ">";
	}
}

###启动应用程序

SpringBootRabbitMQApp 类包含主要方法并负责启动应用程序。
SpringBootRabbitMQApp.java

package org.websparrow;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringBootRabbitMQApp {

	public static void main(String[] args) {
		SpringApplication.run(SpringBootRabbitMQApp.class, args);
	}
}

测试应用程序

要测试应用程序,请通过执行上述类来启动 Spring Boot 应用程序,并按照以下步骤操作:

1. 打开 Postman 客户端并使用 POST 请求点击以下 URL。

URL: 本地主机:8080/send-message

消息:<您想发布的任何内容。>

2.localhost:15672 登录到您的 RabbitMQ 服务器控制台。默认的用户名密码guest

3. 点击 Queues 标签,你会发现队列中有一条消息。

4. 要检查消息内容,请单击队列名称<websparrow.queue> » 获取消息

相关文章

微信公众号

最新文章

更多