1.Queues
- Virtual host 隔离目录
- name 队列名字
- type 类型
- Features 【D代表是一个持久态的队列,服务宕机或重启后队列依然存在】
- state 就绪状态
- Ready 待消费的消息总数
- total 消息总条数
- Unacked 待应答的消息总数
点击queue1进入下一个页面
1.1 overview 查看当前队列基本运行状况和条目数,占用空间,持久化状态,内存状况
1.2 consumers 是否有消费者进行消费
1.3 bindings 绑定的交换机和路由key,如果队列没有绑定任何交换机则会绑定默认交换机
1.4 publish message 发送消息(持久化和非持久化发送)
- 持久化后发送消息会立刻被存盘
- 非持久化重启后队列会被清空
1.5 get message 获取消息
- Nack 预览获取消息
- ack 获取消息消费并且应答,生产环境慎用
1.6 move message 移动消息
1.7 delede、purge删除和清空队列
1.8 runtime metrics 运行队列的基本内存状况和占用磁盘大小
2.Exchanges
- AMQP default 没有绑定任何交换机的队列默认绑定到此交换机
- direct 路由模式
点击AMQP进入下一个页面
- routing key 发送至哪个queue
- payload 发送内容
发送一条消息至队列
- 点击队列查看收到的条数
- 右上角可以设置刷新频率
在get message中查看消息
- message 可以指定取出的条数
- nack获取后队列中条数依然存在
- ack获取后队列中消息消失
代码实现
- maven依赖
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.10.0</version>
</dependency>
- producer
package com.zq.rabbitmq.simple;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
/**
* @author jigua
* @version 1.0
* @className Producer
* @description
* @create 2022/5/12 10:49
*/
public class Producer {
public static void main(String[] args) {
//创建连接工程
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("ip地址");
connectionFactory.setPort(5672);
connectionFactory.setUsername("admin");
connectionFactory.setPassword("密码");
connectionFactory.setVirtualHost("/");
//创建连接connection
Connection connection = null;
Channel channel = null;
try {
connection = connectionFactory.newConnection("生产者");
channel = connection.createChannel();
String queueName = "queue2";
/*
* 队列名称
* 是否持久化
* 是否是独占队列
* 是否自动删除,随着最后一个消费者消息消费完毕是否把队列删除
* 携带附属参数
**/
channel.queueDeclare(queueName, true, false, false, null);
String message = "hello rabbitmq!";
//第一个参数为交换机,没有则会使用默认交换机
channel.basicPublish("", queueName, null, message.getBytes());
System.out.println("消息发送成功");
} catch (Exception e) {
e.printStackTrace();
} finally {
if(channel != null && channel.isOpen()){
try {
channel.close();
}catch (Exception e){
e.printStackTrace();
}
}
if(connection != null && connection.isOpen()){
try {
connection.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
//创建连接获取通道channel
//创建交换机,队列,绑定关系,路由key,发送消息,接收消息
//准备消息
//发送消息给队列queue
//关闭连接
//关闭通道
}
}
- consumer
package com.zq.rabbitmq.simple;
import com.rabbitmq.client.*;
import java.io.IOException;
/**
* @author jigua
* @version 1.0
* @className Consumer
* @description
* @create 2022/5/12 10:49
*/
public class Consumer {
public static void main(String[] args) {
//创建连接工程
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("ip地址");
connectionFactory.setPort(5672);
connectionFactory.setUsername("admin");
connectionFactory.setPassword("密码");
connectionFactory.setVirtualHost("/");
//创建连接connection
Connection connection = null;
Channel channel = null;
try {
connection = connectionFactory.newConnection("生产者");
channel = connection.createChannel();
String queueName = "queue2";
channel.basicConsume(queueName, true, new DeliverCallback() {
@Override
public void handle(String s, Delivery delivery) throws IOException {
System.out.println("收到的消息是" + new String(delivery.getBody(), "UTF-8"));
}
}, new CancelCallback() {
@Override
public void handle(String s) throws IOException {
System.out.println("消息接受失败...");
}
});
} catch (Exception e) {
e.printStackTrace();
} finally {
if(channel != null && channel.isOpen()){
try {
channel.close();
}catch (Exception e){
e.printStackTrace();
}
}
if(connection != null && connection.isOpen()){
try {
connection.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
}
}
- rabbitmq基于channel处理,connection短链接三次握手四次挥手耗时长,所以做了长链接,通过信道 channel来处理消息,性能高
- 非持久化队列也会存盘,但是重启服务会丢失