RabbitMQ
1.“Hello World” - 简单模式
1.1 过程
- 导入依赖
- 创建消息生产者
- 创建消息消费者
1.2 详解
1.导入相关依赖
<!--Rabbit客户端依赖-->
<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>
2.创建消费者
-
设置队列名字
-
创建一个连接工厂
-
设置连接到MQ的账户名和密码
-
创建一个新的连接
-
创建一个信道
-
生成一个队列
-
发送一条消息
注意:消息必须是byte[]数组类型。
public class Producer {
private static final String QUEUE_NAME = "Hello World";
public static void main(String[] args) throws Exception {
// 1. 创建一个连接工厂
ConnectionFactory factory = new ConnectionFactory();
// 2. 设置连接到MQ的账户、密码和主机地址
factory.setHost("xx.xx.xx.xx");
factory.setUsername("admin");
factory.setPassword("123");
// 3. 创建一个新连接并处理异常
Connection connection = factory.newConnection();
// 4. 创建一个新信道
Channel channel = connection.createChannel();
// 5. 生成一个队列
/**
* 参数
* 1.队列名称
* 2.队列里面的消息是否持久化 默认消息存储在内存中
* 3.该队列是否只供一个消费者进行消费 是否进行共享;true 可以多个消费者消费
* 4.是否自动删除 最后一个消费者端开连接以后 该队列是否自动删除;true 自动删除
* 5.其他参数 -- 通过一个Map传递
*/
channel.queueDeclare(QUEUE_NAME,false,false,false,null);
String message = "Hello Pox";
// 6. 发送一个消息
/**
* 参数
* 1.发送到交换机的名称 -- 这里就不指定具体的交换机
* 2.路由的 key
* 3.其他的参数信息
* 4.发送消息的消息体
*/
channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
}
}
3.创建消费者
-
设置队列名字
-
创建一个连接工厂
-
设置连接到MQ的账户名和密码
-
创建一个新的连接
-
创建一个信道
-
消费消息
注意:参数中有两个参数,通过函数式接口创建
public class Consumer {
private static final String QUEUE_NAME = "Hello World";
public static void main(String[] args) throws Exception{
// 连接到MQ
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("xx.xx.xx.xx");
factory.setUsername("admin");
factory.setPassword("123");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
/*
* 消费者的另外两个参数为函数式接口,可以通过函数表达式创建
* */
// 推送的消息如何进行消费的接口回调
DeliverCallback deliverCallback=(consumerTag, delivery)->{
String message= new String(delivery.getBody());
System.out.println(message);
};
// 取消 消费的一个回调接口
CancelCallback cancelCallback=(consumerTag)->{
System.out.println("消息消费被中断");
};
/**
* 消费者消费消息参数:
* 1.消费哪个队列
* 2.消费成功之后是否要自动应答 true 代表自动应答 false 手动应答
* 3.消费者未成功消费的回调
*/
channel.basicConsume(QUEUE_NAME,true,deliverCallback,cancelCallback);
}
}
运行RabbitMQ 服务,编写测试程序,运行生产者再运行消费者,在消费者的控制台接收到消息。
2.Work Queues - 工作模式
工作队列(又称任务队列)的主要思想是避免立即执行资源密集型任务,而不得不等待它完成。相反我们安排任务在之后执行。我们把任务封装为消息并将其发送到队列。在后台运行的工作进程将弹出任务并最终执行作业。当有多个工作线程时,这些工作线程将一起处理这些任务。
对于来的密集消息时,先将消息封装并发送到队列中。然后再将这些消息分发出去到具体的工作线程进行执行,避免大量消息的堆积。
2.1 过程
-
创建工作线程
-
创建消息的发送方
-
启动多个工作线程进行处理
-
消息发送方发送多条消息
工作线程通过轮询的方式处理消息。
2.2 详解
将连接到MQ的过程抽取出来编写为一个工具类。
/*
* RabbitMQ工具类
* */
public class RabbitMQUtil {
/*
* 通过工具类返回一个MQ信道
* */
public static Channel getChannel() throws Exception{
//1.创建一个连接工厂
ConnectionFactory factory = new ConnectionFactory();
//2.设置连接的地址、MQ登录的账户和密码
factory.setHost("xx.xx.xx.xx");
factory.setUsername("admin");
factory.setPassword("123");
//3.创建一个连接
Connection connection = factory.newConnection();
//4.返回信道
return connection.createChannel();
}
}
1.创建工作线程
public class Worker {
// 定义队列的名字
private static final String QUEUE_NAME = "Hello World";
public static void run() throws Exception{
// 将连接到MQ的过程抽取出来编写为一个工具类
Channel channel = RabbitMQUtil.getChannel();