RabbitMQ使用详解
刚刚用了,记录下来,以后忘了,方便能够快速想起来。
首先说明,由于RabbitMQ服务端非JAVA,C++语言,当然也就看不懂,所以本文的理解都是过于主观的。
- 一,RabbitMQ服务端搭建
推荐最好的安装方式:去官网,去官网,去官网,重要的事情说三遍。
我一般的操作流程是:用google右上角翻译网页,然后看个大概意思,然后再显示原网页,一个单词单词的看。
还是总结一下Ubuntu,RabbitMQ安装步骤(依次执行下面四条命令就ok了):
1,echo 'deb http://www.rabbitmq.com/debian/ testing main' |sudo tee /etc/apt/sources.list.d/rabbitmq.list 2,wget -O- https://www.rabbitmq.com/rabbitmq-release-signing-key.asc |sudo apt-key add - 3,sudo apt-get update 4,sudo apt-get install rabbitmq-server
- 二,服务端基本配置
服务端配置,基本上不需要配置就能满足大多数需求。官网如是说,且相信他一次
2.1 界面管理插件的安装
先说一下ubuntu目录下面的日志目录,与脚本目录,一般这是我们最关心的目录:
1,日志目录: /var/log/robbitmq-server 可以通过/etc/logrotate.d/rabbitmq-server进行配置
2,脚本目录:/usr/lib/rabbitmq/bin/
然后进入到脚本目录也就是(cd /usr/lib/rabbitmq/bin/),执行如下命令
rabbitmq-plugins enable rabbitmq_management
这样管理插件算是装好了。
2.2 用户管理
通过http://localhost:15672登录会发现(默认用户guest,密码也是guest),认证失败(登录失败去日志文件查找原因)。
然后自然需要授权了,给一个授权的命令demo,详情自行脑补:
#username就是用户名,可以随便取,pwd就是你要设置的密码rabbitmqctl add_user username pwd#administrator为用户的角色,与tomcat那种管理员配置有点像rabbitmqctl set_user_tags username administrator#授予权限 /代表vhost主机根目录,后面的*j就是读写之类的权限rabbitmqctl set_permissions -p / username ".*" ".*" ".*"
授权之后,讲道理就能登录了,可以看到下面这样的界面:
- 三,RabbitMQ的工作原理(例子稍后奉上)
先体验一下整个消息投递过程:
3.1 RabbitMQ的核心:
核心官网有介绍,说的connecnton,channel之类的,到底怎么样,who care?
总体来看,我们关注业务实现是:1)消息怎么投递的。2)消费者怎么消费消息。3)消息是否是可靠投递。4)消息投递方式。5)消息的生命周期。6)消息队列生命周期
3.2 消息是怎么投递的?(记住一点,生产者消息投递都是面向交换机的)
RabbitMQ 是面向交换机投递消息的。交换机可能绑定有许多队列,交换机如何将消息投递给这些队列呢?
首先说一下面向交换机的设计的优势:1)这明显借助了数据链路层那个交换机的设计思想。除了层级分明以外,还能从分提高链路利用率(可能有点抽像)。
2)从代码层面来看:如果没有交换机,你至少得维护一个十分庞大的路由表,然后从路由表正确投递消息,有了交互机,这里路
由表就会被拆分到多个交换机里面,效果不必多说。
3)然后就是高度的解耦,不同的交换机可有不同的路由规则,要是没有交换机。。。。。。
在RabbitMQ,交换机有4种投递方式,就是枚举类BuiltinExchangeType的4个枚举变量:
DIRECT:会将所有消息先取消息的ROUTE_KEY,然后投递到与ROUTE_KEY绑定的队列里面(if(msg.routekey.equals(queue.routekey)))。
FANOUT:此种模式下,根本不检查消息的ROUTE_KEY,直接投送到交换机所拥有的所有队列里面。
TOPIC,HEADERS自行看一下官网怎么说的,不想码字了^_^||
总结起来就一个函数就把消息发出去了:channel.basicPublish(excange_name,route_key,false,bs,"test".getBytes());可以去官网查一下这个API
3.3 消费者怎么消费消息(记住一点,消费者消费消息是面向消息队列的,这与生成者有点不一样)
还不是就是TCP长连接心跳的那些事,就是这么一个API:channel.basicConsume(QUEUE_AUTODELETE, true, consumer);consumer是Consumer类的一个实例,
你直接去处理回调接口就ok了
3.4 消息传递是否可靠
很明显是可靠的,除非你将消息队列,声明成非持久模式,这事你又重启了机器。这会丢失消息的。还有就是他有应答机制,你可以通过设置消费者消费消息的模式,
去手动应答。channel.basicConsume(?,autoACk,?)的autoAck参数设置
3.5 消息的生命周期
一旦受到消费者应答,标识消息已被消费,则消息被回收掉。
3.6 队列生命周期
channel.queueDeclare(QUEUE_NAME,false,false,true,null);
第二个参数设置为true,会将消息持久化到磁盘,第四个参数设置为true表示没有消息并且没有连接则删除改队列,详情可以查一下API
- 四、一个示例
4.1 生产者代码:
自行导入相关依赖包或相关依赖
![](/assets/blank.gif)
ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");factory.setUsername("username");factory.setPort(5672);//注意这里的端口与管理插件的端口不一样factory.setPassword("pwd");Connection connection = factory.newConnection();Channel channel = connection.createChannel();//声明一个dirent模式的交换机channel.exchangeDeclare("exchange_name",BuiltinExchangeType.DIRECT,true);//声明一个非持久化自动删除的队列channel.queueDeclare("queue_name",false,false,true,null);//如果该队列不在被使用就删除他 zhe//将绑定到改交换机channel.queueBind("queue_name","exchange_name","route_key");//声明一个消息头部Map<String,Object> header=new HashMap<>();AMQP.BasicProperties.Builder b= new AMQP.BasicProperties.Builder();header.put("charset","utf-8");b.headers(header);AMQP.BasicProperties bp=b.build();//将消息发出去channel.basicPublish("exchange_name","route_key",false,bp,"test3".getBytes());
![](/assets/blank.gif)
4.2 消费者代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
ConnectionFactory factory = new ConnectionFactory();
factory.setHost( "localhost" );
factory.setUsername( "username" );
factory.setPort( 5672 ); //注意这里的端口与管理插件的端口不一样
factory.setPassword( "pwd" );
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
//声明一个dirent模式的交换机
channel.exchangeDeclare( "exchange_name" ,BuiltinExchangeType.DIRECT, true );
//声明一个非持久化自动删除的队列
channel.queueDeclare( "queue_name" , false , false , true , null ); //如果该队列不在被使用就删除他 zhe
//将绑定到改交换机
channel.queueBind( "queue_name" , "exchange_name" , "route_key" );
Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,
byte [] body) throws IOException {
String message = new String(body, "UTF-8" );
System.out.println( " [x] Received '" + message + "'" );
}
};
channel.basicConsume( "queue_name" , true , consumer);
|
RabbitMQ使用详解相关推荐
- Windows系统-安装RabbitMQ过程详解(附带软件安装包)
RabbitMQ安装配置过程详解(Windows版) 1.介绍: 本次RabbitMQ安装环境相关信息: Win11 64位专业版 erlang opt_win64_24.0 rabbitmq-ser ...
- RabbitMQ开发详解
目录 开发步骤 引入client 生产者 消费者 应用场景 简单队列 工作队列 发布/订阅 路由模式 topic模式 rpc模式 发布确认 开发步骤 引入client <dependency&g ...
- spring集成RabbitMQ配置文件详解(生产者和消费者)
1,首先引入配置文件org.springframework.amqp,如下: <dependency><groupId>org.springframework.amqp< ...
- (十三)RabbitMQ使用详解
RabbitMQ是基于AMQP的一款消息管理系统.AMQP(Advanced Message Queuing Protocol),是一个提供消息服务的应用层标准高级消息队列协议,其中RabbitMQ就 ...
- RabbitMQ控制台详解
文章目录 属性 说明 overview→Totals 所有队列的阻塞情况 Ready 待消费的消息总数 Unacked 待应答的消息总数 Total 总数 Ready+Unacked 属性 说明 Pu ...
- msmq 发送到远程专用队列不存在_不知道消息中间件是什么?RabbitMQ从头到尾详解介绍...
一.背景 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然在同步消息通讯的世界里有很 ...
- Rabbitmq交换机详解
rabbitmq交换机 1.作用: 接受生产者的消息,然后根据路由键routingKey把消息投递到跟交换机绑定的对应的队列上 2.属性 Name: 交换机的名称 Type: 交换机的类型,direc ...
- RabbitMQ图文详解 | MQ_SpringAMQP | 系统性学习 | 无知的我费曼笔记
重新整理了涉及资料的一些语言描述.排版而使用了自己的描述 . 对一些地方做了补充说明.比如解释专有名词.类比说明.对比说明.注意事项. 提升了总结归纳性.尽可能在每个知识点上都使用一句话 || 关键词 ...
- RabbitMQ原理详解
RabbitMQ:我们通常谈到消息队列,就会联想到这其中的三者:生产者.消费者和消息队列,生产者将消息发送到消息队列,消费者从消息队列中获取消息进行处理.对于RabbitMQ,它在此基础上做了一层抽象 ...
最新文章
- linux 日志工具 logrotate 简介
- 广度优先搜索_深度优先搜索和广度优先搜索[09]
- 用场景来规划测试工作
- 海量数据的实时指标计算
- python中functools_functools模块2个常用函数
- 螺旋桨设计软件_第四届智能工业软件及设计技术研讨会暨2019天洑软件用户大会成功举办...
- 电影票上的字是怎么消失的?
- 运维笔记 - Nginx
- 齐齐哈尔计算机二级,2020齐齐哈尔市计算机二级报名时间|网上报名入口【8月20日9时开通】...
- Struts2通配符问题
- 通俗解释什么是指令集
- Centos 搭建DHCP服务,新建独立网卡完成DHCP实验
- 微信web开发者工具、网易云音乐、为知笔记等软件崩溃无法打开等问题的解决
- Taro开发微信小程序实现简单的登录退出功能
- 计算机考研评分标准,考研复试评分标准来啦!
- 巧用软件下载保存米拍摄影图片的方法
- NLP神经语言学的12条假设(不是自然语言处理哪个NLP哈)
- 黑客在开源网站植入秘密后门、恶意软件通过非常规IP逃避检测|1月25日全球网络安全热点
- JavaScript 实现动物识别专家系统交互演示
- 【微信小程序】一文带你读懂云开发