RabbitMQ是什么?
Java RabbitMQ是一种开源的消息中间件(message broker),它实现了高效的AMQP(Advanced Message Queuing Protocol)协议,用于实现分布式系统中的消息异步传输。RabbitMQ是一个高可用、高性能、易于部署和可伸缩的消息代理系统,具有很强的灵活性,可以帮助开发者在分布式系统中实现消息传递,从而解决系统之间的数据通信和协作问题。
RabbitMQ是一个轻量级的消息代理系统,可以在多种操作系统和语言平台上运行。RabbitMQ的核心设计理念是“生产者”和“消费者”的模型,在此模型下,生产者可以将消息发送到RabbitMQ代理系统中的消息队列(message queue),而消费者可以从队列中获取消息并进行处理。
RabbitMQ可以帮助开发者实现以下功能:
-
消息排队(Queueing):将消息存储在消息队列中,并按照先进先出(FIFO)原则进行排队。
-
消息路由(Routing):将消息发送到特定的队列或交换器(exchange),以便消费者可以从特定的队列或交换器中获取消息。
-
消息确认(Acknowledgement):确认消息已经被消费者处理成功,并通知生产者删掉该消息。
-
消息持久化(Durable message):即使系统发生故障,也能保证消息得到不丢失。
-
发布/订阅模式(Publish/Subscribe):让多个消费者可以同时订阅一个队列或交换器,并接收到相同的消息。
-
Topic模式(Topic):根据消息的标签(Tag)进行筛选,只有与标签匹配的消费者才会接收到消息。
-
请求/响应模式(Request/Response):允许生产者发送请求消息并等待消费者的响应消息。
RabbitMQ是一种可靠的、高效的、易于部署的消息代理系统,它将消息的生产和消费进行了完整的解耦,增加了分布式系统的灵活性和可伸缩性,并在很多场景下取代传统的基于HTTP协议的通信方式,成为实现分布式系统之间高效通信的首选方案之一。
RabbitMQ在Windows和Linux的安装方法
RabbitMQ在Windows和Linux系统上的安装教程步骤如下:
在Windows上安装RabbitMQ:
-
下载Erlang安装包:
下载地址:https://www.erlang.org/downloads
选择适合你操作系统的安装包进行下载(32位或64位)。
-
安装Erlang:
双击下载的安装包,按照向导进行安装。
-
下载RabbitMQ安装包:
下载地址:https://www.rabbitmq.com/download.html
选择适合你操作系统的安装包进行下载。
-
安装RabbitMQ:
双击下载的安装包,按照向导进行安装。安装过程中要记住设置用户名和密码。
-
启动RabbitMQ:
打开命令提示符,进入RabbitMQ安装目录的sbin文件夹,输入以下命令启动RabbitMQ服务:
rabbitmq-server.bat start
如果命令行界面输出了
RabbitMQ started without errors
说明RabbitMQ已经启动。
在Linux上安装RabbitMQ:
-
安装Erlang:
在终端输入以下命令:
sudo apt-get update
sudo apt-get install erlang
-
添加RabbitMQ官方APT存储库的签名到你的系统:
在终端中输入以下命令:
wget -O- https://www.rabbitmq.com/rabbitmq-release-signing-key.asc | sudo apt-key add -
-
添加RabbitMQ官方APT存储库:
在终端中输入以下命令:
sudo apt-get install apt-transport-https
echo "deb https://dl.bintray.com/rabbitmq/debian $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/bintray.rabbitmq.list
sudo apt-get update
-
安装RabbitMQ:
在终端中输入以下命令:
sudo apt-get install rabbitmq-server
-
启动RabbitMQ服务:
在终端中输入以下命令:
sudo service rabbitmq-server start
至此,RabbitMQ在Windows和Linux上安装完成。
代码示例:
Java连接RabbitMQ的示例代码如下:
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.Channel;
public class Send {
private final static String QUEUE_NAME = "hello";
public static void main(String[] argv) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
String message = "Hello World!";
channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
System.out.println(" [x] Sent '" + message + "'");
}
}
}
上述代码演示了如何向名为"hello"的队列发送一个字符串消息"Hello World!"。
SpringBoot整合RabbitMQ
Spring Boot可以很方便地实现和RabbitMQ的整合。下面是实现Spring Boot整合RabbitMQ的步骤和配置代码:
步骤1:添加依赖
在Maven项目中,需要在pom.xml
文件中添加以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
步骤2:配置连接信息
在Spring Boot项目中,RabbitMQ的连接信息可以在application.properties
文件中进行配置。例如:
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
步骤3:定义消息实体类
在RabbitMQ中需要传递的消息可以定义成一个POJO对象,例如:
public class User {
private String name;
private int age;
// getter和setter方法省略
}
步骤4:定义消息发送者
在Spring Boot中,可以使用RabbitTemplate
类实现消息的发送。可以在Spring配置类中创建RabbitTemplate
实例,并定义消息发送的方法,例如:
@Configuration
public class RabbitConfig {
@Bean
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory){
RabbitTemplate rabbitTemplate = new RabbitTemplate();
rabbitTemplate.setConnectionFactory(connectionFactory);
return rabbitTemplate;
}
@Bean
public Queue helloQueue() {
return new Queue("hello");
}
}
rabbitTemplate
方法用于创建RabbitTemplate
实例。helloQueue
方法用于创建队列。队列的名字为hello
。
定义完以上两个方法后就可以创建发送消息的方法,例如:
@Service
public class Sender {
@Autowired
private RabbitTemplate rabbitTemplate;
@Autowired
private Queue helloQueue;
public void send() {
User user = new User();
user.setName("张三");
user.setAge(20);
rabbitTemplate.convertAndSend(helloQueue.getName(), user);
}
}
步骤5:定义消息接收者
定义消息接收者需要在Spring配置类中创建SimpleMessageListenerContainer
实例,并设置MessageListenerAdapter
为消息监听器。例如:
@Configuration
public class RabbitConfig {
@Autowired
private Queue helloQueue;
@Autowired
private Receiver receiver;
@Bean
public SimpleMessageListenerContainer messageListenerContainer(ConnectionFactory connectionFactory) {
SimpleMessageListenerContainer messageListenerContainer = new SimpleMessageListenerContainer();
messageListenerContainer.setConnectionFactory(connectionFactory);
messageListenerContainer.setQueues(helloQueue);
messageListenerContainer.setMessageListener(new MessageListenerAdapter(receiver, "receive"));
return messageListenerContainer;
}
}
messageListenerContainer
方法用于创建SimpleMessageListenerContainer
实例,并设置监听helloQueue
队列。MessageListenerAdapter
是消息监听器的适配器类,用于将接收到的消息转换为Receiver类中的接收方法。
定义完以上方法后就可以创建消息接收者的类。例:
@Service
public class Receiver {
@RabbitListener(queues = "hello")
public void receive(User user) {
System.out.println("Receiver:" + user.getName() + " - " + user.getAge());
}
}
接收者类中的@RabbitListener
注解用于监听队列,当消息到达队列时,会执行receive
方法。
上述代码实现了一个最简单的Spring Boot和RabbitMQ整合的实例,完整代码如下:
User.java
public class User {
private String name;
private int age;
// getter和setter方法省略
}
RabbitConfig.java
@Configuration
public class RabbitConfig {
@Bean
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory){
RabbitTemplate rabbitTemplate = new RabbitTemplate();
rabbitTemplate.setConnectionFactory(connectionFactory);
return rabbitTemplate;
}
@Bean
public Queue helloQueue() {
return new Queue("hello");
}
@Autowired
private Queue helloQueue;
@Autowired
private Receiver receiver;
@Bean
public SimpleMessageListenerContainer messageListenerContainer(ConnectionFactory connectionFactory) {
SimpleMessageListenerContainer messageListenerContainer = new SimpleMessageListenerContainer();
messageListenerContainer.setConnectionFactory(connectionFactory);
messageListenerContainer.setQueues(helloQueue);
messageListenerContainer.setMessageListener(new MessageListenerAdapter(receiver, "receive"));
return messageListenerContainer;
}
}
Sender.java
@Service
public class Sender {
@Autowired
private RabbitTemplate rabbitTemplate;
@Autowired
private Queue helloQueue;
public void send() {
User user = new User();
user.setName("张三");
user.setAge(20);
rabbitTemplate.convertAndSend(helloQueue.getName(), user);
}
}
Receiver.java
@Service
public class Receiver {
@RabbitListener(queues = "hello")
public void receive(User user) {
System.out.println("Receiver:" + user.getName() + " - " + user.getAge());
}
}
在上述代码中,RabbitListener
注解用于标识消息接收者中的方法,Spring Boot会自动监听hello
队列并调用receive
方法。
文章评论