RabbitMQ Spring 项目整合
1.新建mave项目
1.1 新建 maven项目,后期咱们再整合spring boot amqp新建spring boot项目,路要一步一步走,先从简单的maven项目,了解原理,再从spring boot项目 看spring boot封装了什么东西,到底简化了我们的哪些操作
1.2 设置 groupId和artifactId 及maven配置
1.3 选择项目文件夹
1.4 项目新建完成,目录结构如下
1.5 pom中添加 RabbitMQ 客户端依赖
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>3.4.1</version>
</dependency>
RabbitMQ 五种 Queue队列
1.简单队列
简单队列就是 1对1, 1个生产者对应1个消费者
简单队列上代码
1.1 connect 工具类
package com.jzj.mq.conn;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
/**
* 当前描述:
*
* @author: jiazijie
* @since: 2020/6/10 下午11:12
*/
public class MqConnectUtil {
public static Connection getConnectionDefault() throws Exception {
//定义连接工厂
ConnectionFactory factory = new ConnectionFactory();
//设置服务地址
factory.setHost("127.0.0.1");
//端口
factory.setPort(5672);
//设置账号信息,用户名、密码、vhost
factory.setVirtualHost("/");
factory.setUsername("admin");
factory.setPassword("admin");
// 通过工程获取连接
Connection connection = factory.newConnection();
return connection;
}
public static Connection getConnectionJzj() throws Exception {
//定义连接工厂
ConnectionFactory factory = new ConnectionFactory();
//设置服务地址
factory.setHost("127.0.0.1");
//端口
factory.setPort(5672);
//设置账号信息,用户名、密码、vhost
factory.setVirtualHost("jzj");
factory.setUsername("admin");
factory.setPassword("admin");
// 通过工程获取连接
Connection connection = factory.newConnection();
return connection;
}
}
1.2 Producer 生产者-消息产生->发送到交换机->转发到队列存着
package com.jzj.mq.produce;
import com.jzj.mq.conn.MqConnectUtil;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
/**
* 当前描述:生产者
*
* @author: jiazijie
* @since: 2020/6/10 下午11:14
*/
public class Producer {
private final static String QUEUE_NAME = "queue_test";
public static void main(String[] argv) throws Exception {
// 获取到连接以及mq通道
Connection connection = MqConnectUtil.getConnectionDefault();
// 从连接中创建通道
Channel channel = connection.createChannel();
/* 声明(创建)队列 queueDeclare( String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments)
* queue - 队列名
* durable - 是否是持久化队列, 队列的声明默认是存放到内存中的,如果rabbitmq重启会丢失
* exclusie - 是否排外的,仅限于当前队列使用
* autoDelete - 是否自动删除队列,当最后一个消费者断开连接之后队列是否自动被删除,可以通过界面 查看某个队列的消费者数量,当consumers = 0时队列就会自动删除
* arguments - 队列携带的参数 比如 ttl-生命周期,x-dead-letter 死信队列等等
*/
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
// 消息内容
String message = "Hello World!";
/* 发送消息 String exchange, String routingKey, BasicProperties props, byte[] body
* exchange - 交换机 ,"" 空时候指定的是 获取的virtualHost 虚拟服务器的 默认的exchang,每个virtualHost都有一个AMQP default type:direct 直接转发
* queuename - 队列信息
* props - 参数信息
* message 消息体 byte[]类型
*/
channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
System.out.println(" **** Producer Sent Message: '" + message + "'");
//关闭通道和连接
channel.close();
connection.close();
}
}
1.3 消费者->监听队列,有消息就从队列中取出来消息进行消费
package com.jzj.mq.consumer;
import com.jzj.mq.conn.MqConnectUtil;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.QueueingConsumer;
/**
* 当前描述:消费者
*
* @author: jiazijie
* @since: 2020/6/10 下午11:30
*/
public class Consumer {
private final static String QUEUE_NAME = "queue_test";
public static void main(String[] argv) throws Exception {
Connection connection = MqConnectUtil.getConnectionDefault();
Channel channel = connection.createChannel();
/*确保这里的队列是存在的*/
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
System.out.println(" **** Consumer Waiting for messages. To exit press CTRL+C");
QueueingConsumer consumer = new QueueingConsumer(channel);
/* 消息确认机制
* autoAck true:表示自动确认,只要消息从队列中获取,无论消费者获取到消息后是否成功消费,都会认为消息已经成功消费
* autoAck false:表示手动确认,消费者获取消息后,服务器会将该消息标记为不可用状态,等待消费者的反馈,如果消费者一直没有反馈,那么该消息将一直处于不可用状态
* 并且服务器会认为该消费者已经挂掉,不会再给其发送消息,直到该消费者反馈
*/
channel.basicConsume(QUEUE_NAME, true, consumer);
while (true) {
QueueingConsumer.Delivery delivery = consumer.nextDelivery();
String message = new String(delivery.getBody());
System.out.println(" **** Consumer Received '" + message + "'");
}
}
}
1.4 执行结果:
可以看到,Producer生产者生产一条消息,Consumer 就能够消费一条消息
!!!!!!注意 我们在Producer中并没有指定 exchange,传入的exchange也是字符串,它使用的是每一个VirtualHost 下面默认的AMQP default exchange
如下图:
下一篇 我们介绍 工作队列 work模式