1.Docker安装RabbitMQ
1.1下载RabbitMQ镜像
docker pull rabbitmq
1.2创建并启动RabbitMQ容器
docker run -id --hostname myrabbit --name rabbitmq -p 15672:15672 -p 5672:5672 rabbitmq
1.3进入容器交互页面
docker exec -it rabbitmq /bin/bash
1.4下载插件
rabbitmq-plugins enable rabbitmq_management
1.5登录
ip+端口号访问
账号密码均为:guest
1.6拓展
# 创建账号和密码
rabbitmqctl add_user 用户名 密码
# 设置用户角色
rabbitmqctl set_user_tags admin administrator
# 为用户添加资源权限
# set_permissions [-p <vhostpath>] <user> <conf> <write> <read>
# 添加配置、写、读权限
rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
用户级别:
- administrator:可以登录控制台、查看所有信息、可以对 rabbitmq 进行管理。
- monitoring:监控者 登录控制台,查看所有信息。
- policymaker:策略制定者 登录控制台,指定策略。
- managment:普通管理员 登录控制台。
注:有可能会出现下面这个问题
访问Docker的rabbitMq容器的Web-UI界面无法查看消息的状态及出现Stats in management UI are disabled on this node
解决办法:
- 进入RabbitMQ容器
docker exec -it rabbitmq /bin/bash
进入容器后,cd到路径/etc/rabbitmq/conf.d/
cd /etc/rabbitmq/conf.d/
再修改management_agent.disable_metrics_collector
echo management_agent.disable_metrics_collector = false > management_agent.disable_metrics_collector.conf
- 退出容器
exit
- 输入指令
docker exec -it rabbitmq rabbitmq-plugins enable rabbitmq_management
- 重启RabbitMQ
docker restart rabbitmq
2.简单使用
2.1pom.xml文件添加依赖(本环境是jdk1.8的)
<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>
2.2新建Producer类为生产者
package com.youzi.rabbitmq.one;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* @Author youzi
* @ClassName Producer
* @Date 2022/6/30 15:41
* @Description //TODO 生产者
*/
public class Producer {
//设置队列名称
public static final String QUEUE_NAME = "hello";
public static void main(String[] args) throws IOException, TimeoutException {
//1.创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
//2.设置IP
factory.setHost("ip地址");
//3.设置用户名密码
factory.setUsername("用户名");
factory.setPassword("密码");
//4.创建连接
Connection connection = factory.newConnection();
//5.获取信道
Channel channel = connection.createChannel();
/**
* 参数1.队列名称
* 参数2.队列里面的消息是否持久化,默认是不持久化
* 参数3.该队列是否只供一个消费之进行消费,是否进行消息共享,true表示可以多个消费者消费
* 参数4.是否自动删除,最后一个消费者断开连接以后,该队列是否自动删除,true表示自动删除
* 参数5.其他参数
*/
//生成一个队列
channel.queueDeclare(QUEUE_NAME,false,false,false,null);
//消息
String message = "hello youzi";
/**
* 参数1.交换机名称
* 参数2.路由的key值,队列名称
* 参数3.其他参数
* 参数4.消息体
*/
channel.basicPublish("",QUEUE_NAME,null,message.getBytes());
System.out.println("消息发送成功");
channel.close();
connection.close();
}
}
2.3新建Consumer类为消费者
package com.youzi.rabbitmq.one;
import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* @Author youzi
* @ClassName Consumer
* @Date 2022/6/30 16:44
* @Description //TODO 消费者
*/
public class Consumer {
//设置队列名称 一定要和生产者的一样才能找到对应的关系
public static final String QUEUE_NAME = "hello";
public static void main(String[] args) throws IOException, TimeoutException {
//1.创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
//2.设置IP
factory.setHost("IP地址");
//3.设置用户名密码
factory.setUsername("用户名");
factory.setPassword("密码");
//4.创建连接
Connection connection = factory.newConnection();
//5.获取信道
Channel channel = connection.createChannel();
//申明回调方法 未成功消费
DeliverCallback deliverCallback = (consumerTag, message) -> {
System.out.println(new String(message.getBody()));
};
//申明回调方法 取消消费
CancelCallback cancelCallback = consumerTag -> {
System.out.println("消费中断");
};
/**
* 消费者接收消息
* 参数1.队列名称
* 参数2.消费成功之后是否要自动应答,true表示自动应答
* 参数3.消费者未成功消费的回调方法
* 参数4.消费者取消消费时的回调方法
*/
channel.basicConsume(QUEUE_NAME, true, deliverCallback, cancelCallback);
}
}