本文是RabbitMQ的入门篇
安装篇:https://blog.csdn.net/qq_58267473/article/details/124600014
RabbitMQ 的概念
RabbitMQ 是一个消息中间件:它接受并转发消息。你可以把它当做公司,客户把需求提给公司,项目经理项目经理会向下分配工作,按照这种逻辑 RabbitMQ 是一个公司,一个项目经理分配工作。RabbitMQ 与公司的主要区别在于,它不处理需求而是接收,
存储和转发消息数据
四 大核心概念
生产者
产生数据发送消息的程序是生产者
交换机
交换机是 RabbitMQ 非常重要的一个部件,一方面它接收来自生产者的消息,另一方面它将消息
推送到队列中。交换机必须确切知道如何处理它接收到的消息,是将这些消息推送到特定队列还是推
送到多个队列,亦或者是把消息丢弃,这个得有交换机类型决定
队列
队列是 RabbitMQ 内部使用的一种数据结构,尽管消息流经 RabbitMQ 和应用程序,但它们只能存
储在队列中。队列仅受主机的内存和磁盘限制的约束,本质上是一个大的消息缓冲区。许多生产者可
以将消息发送到一个队列,许多消费者可以尝试从一个队列接收数据。这就是我们使用队列的方式
消费者
消费与接收具有相似的含义。消费者大多时候是一个等待接收消息的程序。请注意生产者,消费
者和消息中间件很多时候并不在同一机器上。同一个应用程序既可以是生产者又是可以是消费者。
快速开始
介绍完了我们来看下Rabbit的核心部分
本篇文章对第一部分进行学习
第一步、引入依赖
<!-- 指定 jdk 编译版本 -->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<!--rabbitmq 依赖客户端 -->
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.8.0</version>
</dependency>
<!-- 操作文件流的一个依赖 -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
</dependencies>
第二步、编写消息生产者代码
package com.win.rabbitmq.one;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.TimeoutException;
/**
* Date:2022-05-06
* Author:win
* Description:
* 生产者 : 发信息
*/
public class Producer {
public static final String Queue_NAME="hello";
public static void main(String[] args) throws IOException, TimeoutException, InterruptedException {
// 创建一个连接工厂
ConnectionFactory connectionFactory = new ConnectionFactory();
//工厂IP,连接Rabbit的对列
connectionFactory.setHost("192.168.159.105");
//用户名
connectionFactory.setUsername("admin");
//密码
connectionFactory.setPassword("ok");
//创建连接
Connection con = connectionFactory.newConnection();
//获取信道
Channel channel = con.createChannel();
/**
* 生成一个队列
* 1. 队列名称
* 2. 队列里面的消息是否持久化 默认消息存储在内存中
* 3. 该队列是否只供一个消费者进行消费 是否进行共享 true 可以多个消费者消费
* 4. 是否自动删除 最后一个消费者端开连接以后 该队列是否自动删除 true 自动删除
* 5. 其他参数
*/
channel.queueDeclare(Queue_NAME,false,false,false,null);
//发送的消息
String msg="Hello World";
/**
* 发送一个消息
* 1. 发送到那个交换机
* 2. 路由的 key 是哪个
* 3. 其他的参数信息
* 4. 发送消息的消息体
*/
channel.basicPublish("", Queue_NAME, null, msg.getBytes());
System.out.println("消息发生完毕");
}
}
第三步、消息消费者
package com.win.rabbitmq.one;
import com.rabbitmq.client.*;
import java.awt.geom.FlatteningPathIterator;
import java.io.IOException;
import java.util.MissingFormatArgumentException;
import java.util.concurrent.TimeoutException;
/**
* Date:2022-05-06
* Author:win
* Description:
* 消费者
*/
public class Consumer {
public static final String QUEUE_NAME="hello";
public static void main(String[] args) throws IOException, TimeoutException {
ConnectionFactory factory=new ConnectionFactory();
factory.setHost("192.168.159.105");
factory.setUsername("admin");
factory.setPassword("ok");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
//消费者未成功消费的回调
DeliverCallback deliverCallback = (consumerTag, message) -> {
String s = new String(message.getBody());
System.out.println(consumerTag+s);
};
CancelCallback cancelCallback = consumerTag -> System.out.println("消息消费被中断");
/**
* 消费者消费消息
* 1. 消费哪个队列
* 2.是否自动提交
* 3. 消费成功之后是否要自动应答 true 代表自动应答 false 手动应答
* 4. 消费者未成功消费的回调
*/
channel.basicConsume(QUEUE_NAME, true,deliverCallback,cancelCallback);
}
}
先启动生产者代码再启动消费者代码,原因是生产者没启动时并没有名为hello的队列
建议:信道工具类
因为获取信道的代码是重复的,所以我们可以把它抽出来
package com.win.rabbitmq.utils;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Channel;
/**
* Date:2022-05-06
* Author:win
* Description:工具类
*/
public class RabbitUtils {
public static Channel getChannel() throws Exception {
ConnectionFactory factory=new ConnectionFactory();
factory.setHost("192.168.159.105");
factory.setUsername("admin");
factory.setPassword("ok");
Connection connection = factory.newConnection();
return connection.createChannel();
}
}