RabbitMQ的几种常见模式的详细介绍和使用—实践
官网:RabbitMQ
官方文档:各个模式简介
RabbitMQ就不详细介绍了,以下就是各个模式的原理和实践操作:
1.安装配置
查看mq镜像: docker search rabbitmq:management
下载mq镜像: docker pull rabbitmq:management
安装镜像:docker run -d --name rabbit -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -p 15672:15672 -p 5672:5672 -p 25672:25672 -p 61613:61613 -p 1883:1883 rabbitmq:management
说明
5672:默认的客户端连接的端口
15672:默认的web管理界面的端口
命令中的【RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin】是web管理平台的用户名和密码
【 -p 15672:15672】 是控制平台docker映射到系统的对应端口
【 -p 5672:5672】 是应用程序的访问端口
访问地址
http://ip:15672
如果是linux服务器,首先开放服务器端口,例如阿里云,先配置安全组:
添加:
开始安装:
查询 docker search rabbitmq:management
下载 docker search rabbitmq:management
安装 docker run -d --name rabbit -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -p 15672:15672 -p 5672:5672 -p 25672:25672 -p 61613:61613 -p 1883:1883 rabbitmq:management
安装成功
访问地址:
http://你的ip:15672
2.测试
先创建一个连接类:
package boot.spring.controller;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
/**
* @description
* @AUTHER: sk
* @DATE: 2021/9/26
**/
public class ConnectionUtil {
/**
* 获取连接
* @return Connection
* @throws Exception
*/
public static Connection getConnection() throws Exception {
//定义连接工厂
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("你的ip");
factory.setPort(5672);
//设置vhost
factory.setVirtualHost("/");
factory.setUsername("admin");
factory.setPassword("admin");
//通过工厂获取连接
Connection connection = factory.newConnection();
return connection;
}
}
2.1简单模式
一个生产者,一个消费者。
原理图:
发送:
package boot.spring.controller.easy;
import boot.spring.controller.ConnectionUtil;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
/**
* @description 1.简单模式:一个生产者一个消费者
* @AUTHER: sk
* @DATE: 2021/9/26
**/
public class TestSend {
public final static String QUEUE_NAME = "test-queue";
//创建队列,发送消息
public static void main(String[] args) throws Exception {
//获取连接
Connection connection = ConnectionUtil.getConnection();
//创建通道
Channel channel = connection.createChannel();
//声明创建队列
channel.queueDeclare(QUEUE_NAME,false,false,false,null);
//消息内容
String message = "Hello World!";
channel.basicPublish("",QUEUE_NAME,null,message.getBytes());
System.out.println("发送消息:"+message);
//关闭连接和通道
channel.close();
connection.close();
}
}
生产的一条消息未被消费:
接收:
package boot.spring.controller.easy;
import boot.spring.controller.ConnectionUtil;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.QueueingConsumer;
/**
* @description 简单模式一个生产者一个消费者
* @AUTHER: sk
* @DATE: 2021/9/26
**/
public class TestResive {
//消费者消费消息
public static void main(String[] args) throws Exception {
//获取连接和通道
Connection connection = ConnectionUtil.getConnection();
Channel channel = connection.createChannel();
//声明通道
channel.queueDeclare(TestSend.QUEUE_NAME,false,false,false,null);
//定义消费者
QueueingConsumer consumer = new QueueingConsumer(channel);
//监听队列
channel.basicConsume(TestSend.QUEUE_NAME,true,consumer);
while(true){
//这个方法会阻塞住,直到获取到消息
QueueingConsumer.Delivery delivery = consumer.nextDelivery();
String message = new String(delivery.getBody());
System.out.println("接收到消息:"+message);
}
}
}
已被消费:
2.2 work模式
竞争消费者模式
一个生产者,多个消费者,每个消费者获取到的消息唯一,生产的消息会被消费者瓜分。
原理图:
生产100条消息:
package boot.spring.controller.work;
import boot.spring.controller.ConnectionUtil;
import com.rabbitmq.client.Channel;
import com.rabbitmq.