Rabbitmq
RibbitMQ文档
前言
注意:本文档的环境是CentOS-7-x86_64-DVD-1611.iso,rabbitmq-server
一:什么是消息中间件间
二:消息中如何搭建RebbitMQD建的环境。
-
搭建需要的环境
-
虚拟机:CentOS-7-x86_64-DVD-1611.iso。Centos7下载地址
-
rabbitmq依赖:由于rabbitmq是使用erlang语言开发的,所以需要下载相关依赖包
-
erlang:erlang-solutions-2.0-1.noarch.rpm:需要先解压erlang包在安装
解压: rpm -Uvh erlang-solutions-2.0-1.noarch.rpm 安装: yum install -y erlang -
在安装完erlang时,进行rabbitmq-server包的解压,在进行rabbitmq安装,
解压: rpm -Uvh rabbitmq-server-3.8.14-1.el8.noarch.rpm 安装: yum install -y rabbitmq-server -
如果rabbitmq-server在进行安装时如果出先缺少socat时,需要先进行对socat的安装后在安装rabbitmq-server,,如果没有则直接跳过该步骤即可
安装socat:yum install -y socat 安装rabbitmq:yum install -y rabbitmq-server
-
-
-
校验rabbitmq是否安装成功
-
先校验erlang是否成功,输入erl -version,出现版本号表示erlang安装成功
[root@localhost /]# erl -version Erlang (SMP,ASYNC_THREADS,HIPE) (BEAM) emulator version 11.1.7 -
校验rabbitmq-server是否安装成功,输入systemctl status rabbitmq-server,查看rabbitmq的状态,也可以先开启服务systemctl start rabbitmq-server在查看状态
[root@localhost /]# systemctl status rabbitmq-server ● rabbitmq-server.service - RabbitMQ broker Loaded: loaded (/usr/lib/systemd/system/rabbitmq-server.service; enabled; vendor preset: disabled) Active: **active (running)** since 三 2021-03-17 15:06:42 CST; 1h 6min ago Main PID: 963 (beam.smp) Status: "Initialized" CGroup: /system.slice/rabbitmq-server.service ├─ 963 /usr/lib64/erlang/erts-11.1.7/bin/beam.smp -W w -MBas ageffcbf -MHas ageffcbf -MBlmbcs 512 -MHlmbcs 512 -MMmcs 30 -P 1048576 -t 5000000 -stbt db -zdbbl 128000 -sbwt none -sbwtdcpu none -sb... ├─1026 erl_child_setup 32768 ├─1267 /usr/lib64/erlang/erts-11.1.7/bin/epmd -daemon ├─1292 inet_gethost 4 └─1293 inet_gethost 4 3月 17 15:06:38 localhost.localdomain rabbitmq-server[963]: ########## Licensed under the MPL 2.0. Website: https://rabbitmq.com 3月 17 15:06:38 localhost.localdomain rabbitmq-server[963]: Doc guides: https://rabbitmq.com/documentation.html 3月 17 15:06:38 localhost.localdomain rabbitmq-server[963]: Support: https://rabbitmq.com/contact.html 3月 17 15:06:38 localhost.localdomain rabbitmq-server[963]: Tutorials: https://rabbitmq.com/getstarted.html 3月 17 15:06:38 localhost.localdomain rabbitmq-server[963]: Monitoring: https://rabbitmq.com/monitoring.html 3月 17 15:06:38 localhost.localdomain rabbitmq-server[963]: Logs: /var/log/rabbitmq/rabbit@localhost.log 3月 17 15:06:38 localhost.localdomain rabbitmq-server[963]: /var/log/rabbitmq/rabbit@localhost_upgrade.log 3月 17 15:06:38 localhost.localdomain rabbitmq-server[963]: Config file(s): /etc/rabbitmq/rabbitmq.config 3月 17 15:06:42 localhost.localdomain rabbitmq-server[963]: Starting broker... completed with 3 plugins. 3月 17 15:06:42 localhost.localdomain systemd[1]: Started RabbitMQ broker. -
开启rabbitmq-server的web端访问设置页面插件
- rabbitmq-plugins enable rabbitmq_management:在任意位置输入这个命令用来开启rabbitmq-server的前端配置页面
- 如需开启其他插件可使用:rabbitmq-plugins list 来查看你要开启的插件名
-
登录rabbitmq-server的前端控制页面
-
由于我使用的是rabbitmq.3.8.xx的版本,在启动时会出现一个问题,如图
Job for rabbitmq-server.service failed because the control process exited with error code. See "systemctl status rabbitmq-server.service" and "journalctl -xe" for details. -
然后在通过提示的查看问题的命令 journalctl -xe来查看时发现如下图
[root@192 rabbitmq]# journalctl -xe 3月 17 22:30:41 192.168.190.129 rabbitmq-server[3457]: 22:30:41.800 [error] ERROR: epmd error for host 192: badarg (unknown POSIX error) 3月 17 22:30:41 192.168.190.129 rabbitmq-server[3457]: 22:30:41.800 [error] 3月 17 22:30:41 192.168.190.129 rabbitmq-server[3457]: BOOT FAILED 3月 17 22:30:41 192.168.190.129 rabbitmq-server[3457]: =========== 3月 17 22:30:41 192.168.190.129 rabbitmq-server[3457]: ERROR: epmd error for host 192: badarg (unknown POSIX error) 3月 17 22:30:42 192.168.190.129 rabbitmq-server[3457]: 22:30:42.801 [error] Supervisor rabbit_prelaunch_sup had child prelaunch started with rabbit_prelaunch:run_prelaunch_first_phase() at undefined exit with 3月 17 22:30:42 192.168.190.129 rabbitmq-server[3457]: 22:30:42.802 [error] CRASH REPORT Process <0.151.0> with 0 neighbours exited with reason: {{shutdown,{failed_to_start_child,prelaunch,{epmd_error,"192",ba 3月 17 22:30:44 192.168.190.129 rabbitmq-server[3457]: {"Kernel pid terminated",application_controller,"{application_start_failure,rabbitmq_prelaunch,{{shutdown,{failed_to_start_child,prelaunch,{epmd_error,\"1 3月 17 22:30:44 192.168.190.129 rabbitmq-server[3457]: Kernel pid terminated (application_controller) ({application_start_failure,rabbitmq_prelaunch,{{shutdown,{failed_to_start_child,prelaunch,{epmd_error,"192 3月 17 22:30:44 192.168.190.129 rabbitmq-server[3457]: Crash dump is being written to: erl_crash.dump...done 3月 17 22:30:44 192.168.190.129 systemd[1]: rabbitmq-server.service: main process exited, code=exited, status=1/FAILURE 3月 17 22:30:45 192.168.190.129 rabbitmqctl[3514]: Error: unable to perform an operation on node 'rabbit@192'. Please see diagnostics information and suggestions below. 3月 17 22:30:45 192.168.190.129 rabbitmqctl[3514]: Most common reasons for this are: 3月 17 22:30:45 192.168.190.129 rabbitmqctl[3514]: * Target node is unreachable (e.g. due to hostname resolution, TCP connection or firewall issues) 3月 17 22:30:45 192.168.190.129 rabbitmqctl[3514]: * CLI tool fails to authenticate with the server (e.g. due to CLI tool's Erlang cookie not matching that of the server) 3月 17 22:30:45 192.168.190.129 rabbitmqctl[3514]: * Target node is not running 3月 17 22:30:45 192.168.190.129 rabbitmqctl[3514]: In addition to the diagnostics info below: 3月 17 22:30:45 192.168.190.129 rabbitmqctl[3514]: * See the CLI, clustering and networking guides on https://rabbitmq.com/documentation.html to learn more 3月 17 22:30:45 192.168.190.129 rabbitmqctl[3514]: * Consult server logs on node rabbit@192 3月 17 22:30:45 192.168.190.129 rabbitmqctl[3514]: * If target node is configured to use long node names, don't forget to use --longnames with CLI tools 3月 17 22:30:45 192.168.190.129 rabbitmqctl[3514]: DIAGNOSTICS 3月 17 22:30:45 192.168.190.129 rabbitmqctl[3514]: =========== 3月 17 22:30:45 192.168.190.129 rabbitmqctl[3514]: attempted to contact: [rabbit@192] 3月 17 22:30:45 192.168.190.129 rabbitmqctl[3514]: rabbit@192: 3月 17 22:30:45 192.168.190.129 rabbitmqctl[3514]: * unable to connect to epmd (port 4369) on 192: badarg (unknown POSIX error) 3月 17 22:30:45 192.168.190.129 rabbitmqctl[3514]: Current node details: 3月 17 22:30:45 192.168.190.129 rabbitmqctl[3514]: * node name: 'rabbitmqcli-397-rabbit@192' 3月 17 22:30:45 192.168.190.129 rabbitmqctl[3514]: * effective user's home directory: /var/lib/rabbitmq 3月 17 22:30:45 192.168.190.129 rabbitmqctl[3514]: * Erlang cookie hash: xuQ+TZ3bPaLDI0lSwy/hEQ== 3月 17 22:30:45 192.168.190.129 systemd[1]: Failed to start RabbitMQ broker. -- Subject: Unit rabbitmq-server.service has failed -- Defined-By: systemd -- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel -- -- Unit rabbitmq-server.service has failed. -- -- The result is failed. -
通过查找资料找到解决办法
-
由于3.8的版本在/etc/rabbitmq中没有rabbitmq-env.conf这个配置文件,所以要先创建一个文件,并在文件内容中加上一句话 NODENAME=rabbit@localhost
NODENAME=rabbit@localhost -
在重新启动rabbitmq-server服务,此时可以正常启动,打开浏览器通过虚拟机的ip+:15672(默认端口),就可以进入到rabbitmq-server的登录页面,通过输入 guest(用户名和密码同一个)进行登录,但是此时则会报错,这是因为没有开启宾客访问权限。
-
登录的问题找到原因后,在/etc/rabbitmq/目录下创建一个rabbitmq.config的配置文件,在内容中加上 [{rabbit, [{loopback_users, []}]}]. 后,保存退出,在重启服务即可登录
[{rabbit, [{loopback_users, []}]}]. //注意这个点不要遗漏
-
-
查看rabbitmq-server的状态
- 查看状态:systemctl status rabbitmq-server
- 重启服务:systemctl restart rabbitmq-server
- 停止服务:systemctl stop rabbitmq-server
- 开机自启:systemctl enable rabbitmq-server
-
-
三:RabbitMQ的前端控制页面
- 使用guest成功登录是,则会进入到rabbitmq的主页。
![]()
TyporaSpaces\img\rabbitmq.png)
2. 每个选项卡都具有一定的功能。
四:RabbitMQ的第一个程序(直连)
-
回顾AMQP协议:
-
了解RabbitMQ的工作策略
-
![]()
-
每种模式介绍:
- 编号为1:表示的是直接进行连接(点对点)
- 编号为2:表示是任务模型
- 编号为3:表示广播模型
- 编号为4:表示路由模型
- 编号为5:表示动态路由模型
- 编号为6:表示消息订阅模型
- 编号为7:表示消息确认机制模型
-
-
创建一个Maven工程,并添加amqp-client依赖
<dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client</artifactId> <version>5.7.2</version> </dependency> -
在RabbitMQ前端控制页面中添加一个虚拟主机
-
添加一个自定的虚拟主机
![]()
-
创建一个用户指定登录用户名和密码,并给这个用户进行权限设置
![]()
-
-
在创建的项目中创建一个RabbitMQ生产者Java类,并启动该类中的生产者方法
package com.rabbitmq; import com.rabbitmq.client.AMQP; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; import javax.lang.model.element.VariableElement; import java.io.IOException; import java.util.concurrent.TimeoutException; /** * 创建RabbitMQ的生产者 */ public class ProduceSend { public static void proMessage() throws Exception { //创建mq的连接工厂,让生产者和虚拟主机进行同信 ConnectionFactory conn = new ConnectionFactory(); //设置连接信息 conn.setHost("192.168.190.132"); conn.setVirtualHost("/ems"); //amqp协议端口 conn.setPort(5672); conn.setUsername("ems"); conn.setPassword("ems123"); //获取连接对象 Connection connection = conn.newConnection(); //获取通道 Channel channel = connection.createChannel(); //将通道和消息队列进行绑定 //queue:队列名,没有则自动创建 //durable:是否进行持久化,false 不,true 是 //exclusive:是否独占队列,false 不,true 是 //autoDelete:消费完后是否自动删除队列,false 不,true 是 //arguments:额外附加参数 channel.queueDeclare("hello", false, false, false, null); //发布消息 参数1:交换机名,参数二:队列名,参数三:传递额外消息设置,参数四:消息的具体内容 channel.basicPublish("", "hello", null, "hello-rabbitmq".getBytes()); //关闭通道 channel.close(); //关闭连接 connection.close(); } public static void main(String[] args) throws Exception { proMessage(); } }-
生产者运行成功后,则会将生产者封装的数据在RabbitMQ的前端控制页面上显示
![]()
-
创建一个消费者用来消费生产者产生封装的队列信息中的内容
/** * 创建消费者:用来对生产者生产的数据进行消费 */ public static void customerReicver() throws IOException, TimeoutException { ConnectionFactory connectionFactory = new ConnectionFactory(); connectionFactory.setUsername("ems"); connectionFactory.setPassword("ems123"); connectionFactory.setPort(5672); connectionFactory.setVirtualHost("/ems"); connectionFactory.setHost("192.168.190.132"); //获取连接对象 Connection connection = connectionFactory.newConnection(); //创建通道 Channel channel = connection.createChannel(); } -
第二种消息模型:任务模型(Work)
-
创建生产者
public static void proDSendMess() { try { //获取连接 Connection conn = RabbitUtil.getConn(); //创建通道 Channel channel = conn.createChannel(); //声明队列名,参数一:队列名,参数二:,参数三:,参数四:自动删除队列,参数五:额外参数 channel.queueDeclare("A123", true, false, true, null); for (int i = 0; i < 30; i++) { channel.basicPublish("", "A123", MessageProperties.PERSISTENT_TEXT_PLAIN, (i + "WorkSequence---hello-rabbitmq").getBytes()); } //关闭连接 RabbitUtil.getClose(channel, conn); } catch (Exception e) { e.printStackTrace(); } } -
创建消费者(消费者可以有多个)
//创建消费者A public static void receiveMessA() { try { //获取连接 Connection conn = RabbitUtil.getConn(); //创建通道 Channel channel = conn.createChannel(); // channel.queueDeclare("A123", true, false, true, null); // channel.basicConsume("A123", false, new DefaultConsumer(channel) { @Override public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { System.out.println("A" + body.toString() + "\t===" + new String(body)); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } channel.basicAck(envelope.getDeliveryTag(),false); } }); } catch (IOException e) { e.printStackTrace(); } } //创建消费者B public static void receiveMessB() { try { //获取连接 Connection conn = RabbitUtil.getConn(); //创建通道 Channel channel = conn.createChannel(); // channel.queueDeclare("A123", true, false, true, null); // channel.basicConsume("A123", false, new DefaultConsumer(channel) { @Override public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { System.out.println("B" + body.toString() + "\t===" + new String(body)); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } channel.basicAck(envelope.getDeliveryTag(),false); } }); } catch (IOException e) { e.printStackTrace(); } }
-
-
第三种消息模型:广播模型
-
广播模型简介
-
创建生产者
-
创建消费者
-
-
第四种消息模型:路由模型
-
路由模型简介
-
创建生产者
-
创建消费者
-
-
第五种消息模型:动态路由模型(路由模型下的一种分支)
-
动态路由模型简介
-
创建生产者
-
创建消费者
-
-
第六种消息模型:RPC模型
-
rpc模型简介
-
创建生产者
-
创建消费者
-
-
第七种消息模型:消息确认机制模型
-
消息确认机制模型简介
-
创建生产者
-
创建消费者
-
-






浙公网安备 33010602011771号