在 IntelliJ IDEA 中创建 Spring Boot 项目并调试 Spring for RabbitMQ 的完整流程。
创建项目的步骤以往的文章都有详细步骤,这里不再细说。
如参考:
SpringBoot 依赖之Spring Web
选择合适的依赖 Spring for RabbitMQ
和 Spring Boot DevTools
(用于开发时的热部署),其他需要的依赖也可以自行添加,比如Spring Web,Lombok等。
IDEA 将自动创建并初始化项目。
通常,通过 Spring Initializr 创建的项目已经包含了 Spring for RabbitMQ
依赖。如果没有,可以手动添加:
在 pom.xml
中添加以下依赖:
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-amqpartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-devtoolsartifactId>
<scope>runtimescope>
<optional>trueoptional>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<optional>trueoptional>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
<dependency>
<groupId>org.springframework.amqpgroupId>
<artifactId>spring-rabbit-testartifactId>
<scope>testscope>
dependency>
dependencies>
在 src/main/resources/application.properties
中,配置 RabbitMQ 的连接信息:
spring.application.name=spring-for-rabbitmq
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.rabbitmq.virtual-host: /mirror #virtual-host起隔离作用,默认为:/
#自定义配置
spring.rabbitmq.template.default-receive-queue=myQueue
spring.rabbitmq.template.exchange=myExchange
spring.rabbitmq.template.routing-key=myRoutingKey
如果你有自定义的队列、交换器等配置,也可以在 application.properties
中添加:
spring.rabbitmq.template.default-receive-queue=myQueue
spring.rabbitmq.template.exchange=myExchange
spring.rabbitmq.template.routing-key=myRoutingKey
首先,创建一个配置类,用于声明队列、交换器和绑定:
package com.example.springforrabbitmq.configuration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
/**
* @author zhizhou 2024/9/3 23:10
*/
@Configuration
public class RabbitMQConfig {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Value("${spring.rabbitmq.host}")
private String host;
@Value("${spring.rabbitmq.port}")
private int port;
@Value("${spring.rabbitmq.username}")
private String username;
@Value("${spring.rabbitmq.password}")
private String password;
@Value("${spring.rabbitmq.virtual-host}")
private String virtualhost;
public static final String QUEUE_NAME = "myQueue";
public static final String EXCHANGE_NAME = "myExchange";
@Bean
public Queue queue() {
return new Queue(QUEUE_NAME, false);
}
@Bean
public TopicExchange exchange() {
return new TopicExchange(EXCHANGE_NAME);
}
@Bean
public Binding binding(Queue queue, TopicExchange exchange) {
return BindingBuilder.bind(queue).to(exchange).with("routing.key.#");
}
@Bean
public ConnectionFactory connectionFactory() {
CachingConnectionFactory connectionFactory = new CachingConnectionFactory(host, port);
connectionFactory.setUsername(username);
connectionFactory.setPassword(password);
connectionFactory.setVirtualHost(virtualhost);
return connectionFactory;
}
@Bean
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
return rabbitTemplate;
}
}
接下来,编写一个服务类,发送消息到 RabbitMQ:
package com.example.springforrabbitmq.service;
import com.example.springforrabbitmq.configuration.RabbitMQConfig;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @author zhizhou 2024/9/3 23:11
*/
@Service
public class MessageProducer {
@Autowired
private RabbitTemplate rabbitTemplate;
public void sendMessage(String message) {
rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_NAME, "routing.key.test", message);
System.out.println("Message Sent: " + message);
}
}
创建一个消费者类,处理从 RabbitMQ 接收的消息:
package com.example.springforrabbitmq.service;
import com.example.springforrabbitmq.configuration.RabbitMQConfig;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Service;
/**
* @author zhizhou 2024/9/3 23:12
*/
@Service
public class MessageConsumer {
@RabbitListener(queues = RabbitMQConfig.QUEUE_NAME)
public void receiveMessage(String message) {
System.out.println("Message Received: " + message);
}
}
编写一个简单的测试类来测试消息的发送和接收:
package com.example.springforrabbitmq;
import com.example.springforrabbitmq.service.MessageProducer;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
/**
* @author zhizhou 2024/9/3 23:13
*/
@SpringBootTest
public class RabbitMQIntegrationTest {
@Autowired
private MessageProducer messageProducer;
@Test
public void testSendMessage() {
messageProducer.sendMessage("Hello, 兔子宝宝!");
}
}
运行 Run 'RabbitMQIntegrationTest'
,测试方法将会启动并发送一条消息到 RabbitMQ。一般来讲我们会在控制台中查看消息发送和接收的日志输出。
Spring Boot DevTools 提供了热部署的功能,在开发过程中可以自动重新加载修改后的代码。至于热部署的配置可以参阅之前的文章
SpringBoot依赖之Spring Boot DevTools热部署开发增效工具
启动 Spring Boot 应用程序,确保 RabbitMQ 正在运行。你可以使用 RabbitMQ Management
插件或其他工具监控消息的发送和接收情况。
至此我们已经实现了在 IntelliJ IDEA 中创建 Spring Boot 项目,并集成并调试 Spring for RabbitMQ依赖包。依靠Spring成熟的生态,我们可以根据自己业务的实际需求进一步扩展功能,比如添加更多复杂的消息处理逻辑、错误处理和重试机制等。
扩展:
我们也可以思考下RabbitMQ 和RocketMQ的异同点,为什么面试经常问到实现原理?