RabbitMQ学习笔记 编程不良人
这里写目录标题
MQ介绍和安装
基于AMQA协议 ,erlang语言开发,和Spring整合很好,数据一致性 (消息的丢失,错误处理)处理的很好,
生产者将消息发送到服务的的虚拟主机内的交换机 交换机将消息通过特定规则放入特定的消息队列 消息队列再将消息发送给消费者 (Kafka是消费者去消息队列去读取消息)
安装的话我自己就直接用docker安装
启动
geust/geust登录
rabbitmqctl 介绍
查看用户命令
查看插件
6中模型
“Hello Word 模型”
新建模块
新建一个虚拟主机
新建一个用户
新建的用户绑定虚拟主机
生产者生产消息
发送消息代码
package com.luyi;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import org.junit.Test;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* @author 卢意
* @create 2020-11-25 18:57
*/
public class Provider {
//生产消息
@Test
public void testSendMessage() throws IOException, TimeoutException {
// 创建连接mq的连接工厂
ConnectionFactory connectionFactory=new ConnectionFactory();
// 设置链接rabbitmq主机
connectionFactory.setHost("192.168.216.138");
// 设置主机端口号
connectionFactory.setPort(5672);
// 设置连接哪个虚拟主机
connectionFactory.setVirtualHost("/ems");
// 设置访问虚拟主机的用户名和密码
connectionFactory.setUsername("ems");
connectionFactory.setPassword("123");
// 获取连接对象
Connection connection = connectionFactory.newConnection();
// 通过连接获取连接中的通道对象
Channel channel = connection.createChannel();
// 通道绑定对应的消息队列
// 参数 队列名称(不存在的时候自动创建)
// 用来定义队列特征是要持久化
// 是否独占队列(true 就只能被当前连接使用)
// 是否在消费完成后自动删除队列
// 附加参数
channel.queueDeclare("hello",false,false,false,null);
//发布消息
// 参数 交换名称
// 对接名称
// 传递参数的额外设置
// 消息的具体内容
channel.basicPublish("","hello" , null,"hello rabbitmq".getBytes());
channel.close();
}
}
有消息进来
消费者消费消息
消费者类
package com.luyi;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DefaultConsumer;
import org.junit.Test;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* @author 卢意
* @create 2020-11-25 19:15
*/
public class Consumer {
// 消费消息
@Test
public void testGetMessage() throws IOException, TimeoutException {
// 创建连接mq的连接工厂
ConnectionFactory connectionFactory=new ConnectionFactory();
// 设置链接rabbitmq主机
connectionFactory.setHost("192.168.216.138");
// 设置主机端口号
connectionFactory.setPort(5672);
// 设置连接哪个虚拟主机
connectionFactory.setVirtualHost("/ems");
// 设置访问虚拟主机的用户名和密码
connectionFactory.setUsername("ems");
connectionFactory.setPassword("123");
// 获取连接对象
Connection connection = connectionFactory.newConnection();
// 通过连接获取连接中的通道对象
Channel channel = connection.createChannel();
// 通道绑定对应的消息队列
// 参数 队列名称(不存在的时候自动创建)
// 用来定义队列特征是要持久化
// 是否独占队列(true 就只能被当前连接使用)
// 是否在消费完成后自动删除队列
// 附加参数
channel.queueDeclare("hello",false,false,false,null);
// 消费消息
//参数 消费哪个对列的消息 队列名称
// 开启消息的自动确认机制
// 消费时的回调接口
DefaultConsumer defaultConsumer = new DefaultConsumer(channel);
channel.basicConsume("hello", true,new DefaultConsumer(channel));
channel.close();
connection.close()