rabbitMq安装使用
1. 下载rabbitMq以及对应依赖
地址:http://www.rabbitmq.com/install-windows.html
2. 安装rabbitMq
安装完默认是启动
查看rabbitMq状态
安装完后进入对应的安装目录,执行rabbitmqctl status,当打印如下内容说明安装正确
如果报:Error: unable to perform an operation on node ‘rabbit@。。。。。。。。。
复制 C:\Windows\System32\config\systemprofile.erlang.cookie 到 C:\Users\ada.erlang.cookie
重试:rabbitmqctl status
安装rabbitMq管理插件
接下来我们需要安装 RabbitMQWeb的管理插件,接着上面继续输入以下命令:rabbitmq-plugins enable rabbitmq_management
回车后可以到以下输出:
此时,已经可以通过 http://127.0.0.1:15672/ 地址来访问web管理界面了,默认的账户和密码均是 guest。
但实际使用时可能需要重新一个新的管理账户。下面即继续通过命令来创建新的账户并且
查看默认的账户列表信息,输入:rabbitmqctl.bat list_users
新建账户
新建账户:
rabbitmqctl.bat add_user shaozhiqi shaozhiqi
授予权限和角色
授予所有权限输入:
rabbitmqctl.bat set_permissions -p / shaozhiqi ".*" ".*" ".*"
设置为管理员角色:
用新添加的账号登录
停止rabbitMq
或
这里日志报异常,但是服务却启动了
http://127.0.0.1:15672/#/可以访问了
起停建议在开始菜单中操作
3. 常用命名
翻译: bobning
编译和安装
ubuntu或debian下的安装非常简单
apt-get install rabbitmq-server
默认的数据库内容
当第一次启动服务,检测数据库是否未初始化或者被删除,它会用下面的资源初始化一个新的数据库:
一个命名为 / 的虚拟宿主一个名为guest密码也为guest的用户,他拥有/虚拟宿主的所有权限
如果你的中间件是公开访问的,最好修改guest用户的密码。
管理概观
rabbitmqctl 是RabbitMQ中间件的一个命令行管理工具。它通过连接一个中间件节点执行所有的动作。本地节点默认被命名为”rabbit”。可以通过这个命令前使 用”-n”标志明确的指定节点名称, 例如:
# rabbitmqctl -n rabbit@shortstop add_user tonyg changeit
这个命令指示RabbitMQ中间件在rabbit@shortstop 节点创建一个tonyg/changeit的用户。
在一个名为”server.example.com”的主机,RabbitMQ Erlang节点的名称通常是rabbit@server(除非RABBITMQ_NODENAM在 中间件启动时候被设置)。
hostnam -s 的输出通常是”@”符号正确的后缀。
rabbitmqctl 默认产生详细输出。通过”-q”标示可选择安静模式。
rabbitmqctl -q status
应用和集群管理
1.停止RabbitMQ应用,关闭节点
# rabbitmqctl stop
2.停止RabbitMQ应用
# rabbitmqctl stop_app
3.启动RabbitMQ应用
# rabbitmqctl start_app
4.显示RabbitMQ中间件各种信息
# rabbitmqctl status
5.重置RabbitMQ节点
# rabbitmqctl reset
# rabbitmqctl force_reset
从它属于的任何集群中移除,从管理数据库中移除所有数据,例如配置过的用户和虚拟宿主, 删除所有持久化的消息。
force_reset命令和reset的区别是无条件重置节点,不管当前管理数据库状态以及集群的配置。如果数据库或者集群配置发生错误才使用这个最后 的手段。
注意:只有在停止RabbitMQ应用后,reset和force_reset才能成功。
6.循环日志文件
# rabbitmqctl rotate_logs[suffix]
7.集群管理
# rabbitmqctl cluster clusternode…
用户管理
1.添加用户
# rabbitmqctl add_user username password
2.删除用户
# rabbitmqctl delete_user username
3.修改密码
# rabbitmqctl change_password username newpassword
4.列出所有用户
# rabbitmqctl list_users
权限控制
1.创建虚拟主机
# rabbitmqctl add_vhost vhostpath
2.删除虚拟主机
# rabbitmqctl delete_vhost vhostpath
3.列出所有虚拟主机
# rabbitmqctl list_vhosts
4.设置用户权限
# rabbitmqctl set_permissions [-p vhostpath] username regexp regexp regexp
5.清除用户权限
# rabbitmqctl clear_permissions [-p vhostpath] username
6.列出虚拟主机上的所有权限
# rabbitmqctl list_permissions [-p vhostpath]
7.列出用户权限
# rabbitmqctl list_user_permissions username
4. 与springboot进行结合
4.1 Pom
4.2 一个生产者-多个消费者
生产者:
消费者1:
消费者2:
Rabbitmq配置类:以队列为例
建一个定时任务,一秒发一次
启动服务
可以看到一个消息只能被消费一次,并且是两个消费值依次消费。消费优先级和消费次数待研究
4.3 多个生产者,多个消费者
将4.2 的消费者类在克隆一个,给相同的队列发,结果和4.2的结果类似,只是在日志中多了一个新克隆的发送者。
4.4 当然系列的存储内容也可以是一个对象
4.5 Topic交换器介绍
Topic Exchange 转发消息主要是根据通配符。 在这种交换机下,队列和交换机的绑定会定义一种路由模式,那么,通配符就要在这种路由模式和路由键之间匹配后交换机才能转发消息。
在这种交换机模式下:
路由键必须是一串字符,用句号(.) 隔开,比如说 agreements.us,或者 agreements.eu.stockholm 等。
路由模式必须包含一个 星号(),主要用于匹配路由键指定位置的一个单词,比如说,一个路由模式是这样子:agreements..b.,那么就只能匹配路由键是这样子的:第一个单词是 agreements,第四个单词是 b。 井号(#)就表示相当于一个或者多个单词,例如一个匹配模式是agreements.eu.berlin.#,那么,以agreements.eu.berlin开头的路由键都是可以的。
具体代码发送的时候还是一样,第一个参数表示交换机,第二个参数表示routing key,第三个参数即消息。如下:
rabbitTemplate.convertAndSend("testTopicExchange","key1.a.c.key2", " this is RabbitMQ!");
topic 和 direct 类似, 只是匹配上支持了"模式", 在"点分"的 routing_key 形式中, 可以使用两个通配符:
*表示一个词.
表示零个或多个词.
此类交换器使得来自不同的源头的消息可以到达一个对列,其实说的更明白一点就是模糊匹配的意思,例如:上图中红色对列的routekey为usa.#,#代表匹配任意字符,但是要想消息能到达此对列,usa.必须匹配后面的#好可以随意。图中usa.news,usa.weather都能找到红色队列,符号“#”匹配一个或多个词,符号“”匹配不多不少一个词。因此“usa.#”能够匹配到“usa.news.XXX”,但是“usa.” 只会匹配到“usa.XXX”。
注:交换器说到底是一个名称与队列绑定的列表。当消息发布到交换器时,实际上是由你所连接的信道,将消息路由键同交换器上绑定的列表进行比较,最后路由消
发送的时候需要说明:那个交换机、那个队列、发送内容,
消息接收机制:队列绑定了对应的交换机,设置了接收统配符;
如:
队列:topic.messages 接收交换机topicExchange发过来的的路由名统配topic.#的所有消息
所以可以看出:topic.messages的接收监听者可以接收上面三种发送发送过来的任何消息。
同样,每个消息只消费一次,但是在消费前会先给交换机,交换机通过统配路由key,将消息同时发送给一个或多个消费者,所以貌似一个消息被多次消费了。
4.6 rabbitMq交换机的概念
交换机的主要作用是接收相应的消息并且绑定到指定的队列.交换机有四种类型,分别为Direct,topic,headers,Fanout.
Direct是RabbitMQ默认的交换机模式,也是最简单的模式.即创建消息队列的时候,指定一个BindingKey.当发送者发送消息的时候,指定对应的Key.当Key和消息队列的BindingKey一致的时候,消息将会被发送到该消息队列中.
topic转发信息主要是依据通配符,队列和交换机的绑定主要是依据一种模式(通配符+字符串),而当发送消息的时候,只有指定的Key和该模式相匹配的时候,消息才会被发送到该消息队列中.
headers也是根据一个规则进行匹配,在消息队列和交换机绑定的时候会指定一组键值对规则,而发送消息的时候也会指定一组键值对规则,当两组键值对规则相匹配的时候,消息会被发送到匹配的消息队列中.
Fanout是路由广播的形式,将会把消息发给绑定它的全部队列,即便设置了key,也会被忽略