tp6安装并使用rabbitMQ

最近因为业务需要,要用到MQ就去研究了一下,说实话,安装环境给我搞自闭了,大概是我太菜

刚开始使用yum换源,各种安装卸载始终找不到自己要用的版本,后来全部卸载,下载安装包

编译安装解百忧

我用的是erlang 25.3 的版本,MQ使用的是3.11.3的版本,符合官方要求,这里的版本是有强制要求的,也就是固定erlang对应固定MQ,版本如下

 

 搞错,会无法运行

编译安装erlang25

编译安装老一套,

解压,

cd 进目录

./configure (这里我记得需要有一些 选项,不过我好像没安装,就不多说了)

make && make install

漫长的等待...

结束后 

vim /etc/profile

增加 

export PATH=$PATH:(你的erlang解压目录)/otp_src_25.3/bin

source /etc/profile(刷新环境变量,使其生效)

然后运行erl 看会不会有反应 安装成功后应该是

 接下来就是 安装MQ  相比erlang 简单很多,因为是编译安装,所以systemctl无法管理这个

下载MQ安装包.然后 解压缩,cd进解压后的目录,里面有个sbin cd 进入

然后使用   ./rabbitmq-server 命令就可以启动了

 这样就是成功了

接下来就是安装插件,进入目录  使用 ./rabbitmq-plugins list  查看安装的插件目录

这里需要安装一个插件 指令为  rabbitmq-plugins enable rabbitmq_management

这是MQ的web管理插件,记得开启15672端口,不然外部无法访问,默认账号密码都是guest

但是在本地登录时不行的,需要创建账号密码,

./rabbitmqctl add_user <你的用户名> <你的密码>

./rabbitmqctl set_permissions -p / <你的用户名> ".*" ".*" ".*"

然后就可以登陆了

到这里,算是安装完成了.接下来就是基础使用

我使用的是thinkPHP

首先使用composer 安装  MQ官方库

composer require php-amqplib/php-amqplib:3.5.0 

安装后先启动 消费端

    //这是链接,个人习惯,有问题的话还请指正
    public function __construct()
    {
        parent::__construct();
        if ($this->connection != null) {
            return $this->connection;
        }
        try {
            $this->connection = (new AMQPStreamConnection(
                $this->host,        ip
                $this->port,        端口
                $this->user,        用户
                $this->password,    密码
                $this->vhost,        暂未用到 默认 /
            ));
            $this->channel = $this->connection->channel();
        }catch (\Exception $e) {
            Log::write("连接错误:".$e->getMessage(), "rabbitmq-log");
            throw new apiException("MQ连接异常".$e->getMessage());
        }
    }


    protected function execute(Input $input, Output $output)
    {
        //交换机  交换机分多种,常用的是直连
        $this->exchange = $input->getArgument('exchange');
        //通道    消费对应通道的消息
        $this->quent = $input->getArgument('quent');
        //测试

        $type = $mqType ? 'x-delayed-message' : "direct";
        $key = $mqType ? 'my_routing_key' : "";
        $durable = $mqType;
        exchange:要声明的exchange名称,必须是一个非空字符串。
        //type:exchange类型,可以是direct、topic、headers或fanout之一。
        //passive:如果设置为true,则不会创建exchange,仅检查是否存在指定名称的exchange。默认为false。
        //durable:如果设置为true,则exchange将在重启后继续存在。默认为false。
        //auto_delete:如果设置为true,则exchange将在最后一个绑定被删除后自动删除。默认为false。
        //internal:如果设置为true,则exchange将用于内部用途,不允许客户端发布消息到该exchange。默认为false。
        //arguments:其他参数,通常为键值对,用于指定exchange的特定属性。默认为null。

        $this->channel->exchange_declare($this->exchange, "direct", false, true, false);

        queue:队列名称,如果该队列不存在则会创建。
        passive:如果为true,则不会创建队列。如果队列不存在,则会返回一个错误。
        durable:如果为true,则队列将被持久化。当RabbitMQ服务器重启时,队列将保留下来。
        exclusive:如果为true,则队列只能被当前连接使用,当连接关闭时队列将被删除。该选项通常用于创建临时队列。
        auto_delete:如果为true,则当没有消费者使用时自动删除队列。
        arguments:一些额外的参数,例如队列的最大长度、消息的过期时间等。


        $this->channel->queue_declare($this->quent, false, true, false, false);


        //$this->quent  队列
        //$this->exchange 交换机  进行绑定
        $this->channel->queue_bind($this->quent, $this->exchange, "");


        //一次处理1条
        $this->channel->basic_qos(0, 1, false);


        $callback = function ($msg) {
                  //接收数据
                $info = json_decode($msg->body, true);
                //进行接收,否则以上文的配置 消息会一直存在
                $this->channel->basic_ack($msg->delivery_info['delivery_tag']);

        };


        //queue:需要消费的队列名称。
        //consumer_tag 是用于唯一标识一个消费者的字符串
        //no_local 防止消费者接收到自己发送的消息
        //no_ack指的是消费者在消费完消息后不需要向服务器发送确认消息
        //Exclusive指定了队列的排他性。如果一个队列被标记为Exclusive,那么只有创建该队列的连接可以使用它
        //nowait是指在使用 IBM MQ API 发送或获取消息时,如果队列中没有可用的消息,API 将立即返回,而不是等待消息到达。这可以避免程序在等待消息时被阻塞,从而提高程序的效率。
        //callback  接收消息后的处理函数

        $this->channel->basic_consume($this->quent, '', false, false, false, false, $callback,);
        while (count($this->channel->callbacks)) {
            try {
                $this->channel->wait();
            } catch (\Exception $e) {
                echo $e->getFile() . $e->getLine() . $e->getMessage();
                return "error";
            }
        }
        //关闭链接
        $this->channel->close();
        $this->connection->close();
    }

因为使用的tp6 所有在根目录 使用 php think  文件名就可以执行了  自定义指令 · ThinkPHP6.0完全开发手册 · 看云  这是官方文档

接下来说发布者


    public function __construct()
    {
        parent::__construct();
        if ($this->connection != null) {
            return $this->connection;
        }
        try {
            $this->connection = (new AMQPStreamConnection(
                $this->host,        ip
                $this->port,        端口
                $this->user,        用户
                $this->password,    密码
                $this->vhost,        暂未用到 默认 /
            ));
            $this->channel = $this->connection->channel();
        }catch (\Exception $e) {
            Log::write("连接错误:".$e->getMessage(), "rabbitmq-log");
            throw new apiException("MQ连接异常".$e->getMessage());
        }
    }


     public function send(){
        //exchange:要声明的 Exchange 的名称。
        //type:Exchange 的类型,如 direct、topic、fanout、headers 等。
        //passive:如果设置为 true,则不会创建 Exchange,只会检查该 Exchange 是否存在。默认为 false。
        //durable:如果设置为 true,则 Exchange 会被持久化到磁盘上,即使 RabbitMQ 服务器重启也不会丢失。默认为 false。
        //auto_delete:如果设置为 true,则当没有队列或者交换机绑定到该 Exchange 时,自动删除该 Exchange。默认为 false。
        //internal:如果设置为 true,则 Exchange 不能被客户端用来发送消息,只能被 Exchange 和队列之间的绑定使用。默认为 false。
        //arguments:用于声明 Exchange 的其他参数,如 x-message-ttl、x-dead-letter-exchange 等。默认为 null。

        $this->channel->exchange_declare($this->exchange, $this->type, true, false, false);


        //queue:队列名称,如果为空则表示由消息代理自动生成一个唯一的队列名称。
        //passive:如果为true,则不会创建该队列,而是检查该队列是否存在。如果该队列不存在,则返回一个通道级别的异常。
        //durable:如果为true,则表示该队列是持久化的,即在消息代理重启后该队列仍然存在。
        //exclusive:如果为true,则表示该队列只能被当前连接使用,并且在连接断开时会自动删除该队列。
        //auto_delete:如果为true,则表示该队列在没有任何消费者使用时会自动删除。
        //arguments:用于传递额外的参数,例如队列的最大长度、消息过期时间等。*/

                $this->channel->queue_declare($this->quent, false, false, false, false);
                
            //发送消息
                $message = new AMQPMessage($msg);
            }
            $this->channel->basic_publish($message, $this->exchange, $this->key);
     }

到这里就算完结了 这里是即时到达,还有延时到达会麻烦一点

首先两种实现方法,我用的比较简单,安装插件

./rabbitmq-plugins enable rabbitmq_delayed_message_exchange

然后创建延时交换机,和即时到达的有区别,建议去web管理端创建

 

插件完成后 会有这个选项

 

 这就是最终填写的数据

提交后就有了.然后  发布和上面是一样的 ,不过类型要变  type 变成  x-delayed-message 也要设置 key  参数durable 变量为 true

 

接收的话  也是同理,type变化为  x-delayed-message    参数durable 变量为 true   

这里是你设置的key 

到这里 就结束了,安装 发布,消费,.整个过程,写的比较粗糙,有啥错误还请指正

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/30243.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

TCP为什么要三次握手与四次分手?

概要 TCP协议是五层协议中运输层的协议&#xff0c;下面依赖网络层、链路层、物理层&#xff0c;对于一个报文想发到另一台机器(假设是服务器)上对等层&#xff0c;每一个所依赖的层都会对报文进行包装&#xff0c;例如TCP协议就依赖网络层的IP协议&#xff0c;所以发送的报文会…

实习记录(二)Java常用工具库

一.Lombok 1.背景概述 Lombok是一个非常高效的专用于Java的自动构建插件库&#xff0c;其简化了 JavaBean 的编写&#xff0c;避免了冗余和样板式代码的出现&#xff0c;让编写的类更加简洁明了&#xff0c;可以帮助大家节省很多重复低效的代码编写。比如重复性的Setter、Gett…

日志是什么?耗时2个月搞懂Linux日志

这里写目录标题 日志基本介绍日志管理服务日志轮替 日志基本介绍 日志是用来记录重大事件的工具。 日志文件是重要的系统信息文件&#xff0c;其中记录了很多重要的系统事件。包括用户的登录信息&#xff0c;系统的启动信息&#xff0c;系统的安全信息&#xff0c;邮件相关信息…

ChatGPT:数字时代革新与展望

ChatGPT&#xff1a;数字时代革新与展望 AGI 未来的愿景&#xff1a;建安全有益的 AGI OpenAI团队对AGI的展望&#xff1a; 我们希望 AGI 能够赋予人类在宇宙中最大程度地繁荣发展的能力。我们不期望未来是一个不合格的乌托邦&#xff0c;但我们希望将好的最大化&#xff0c;将…

【云计算 | Azure】微软 Azure 基础解析(九)Azure 标识、身份管理、Azure AD 的功能与用途

本系列博文还在更新中&#xff0c;收录在专栏&#xff1a;「Azure探秘&#xff1a;构建云计算世界」 专栏中。 本系列文章列表如下&#xff1a; 【Azure】微软 Azure 基础解析&#xff08;三&#xff09;云计算运营中的 CapEx 与 OpEx&#xff0c;如何区分 CapEx 与 OpEx 【A…

国产MCU-CW32F030开发学习--按键检测

国产MCU-CW32F030开发学习–按键检测 bsp_key 按键驱动程序用于扫描独立按键&#xff0c;具有软件滤波机制&#xff0c;采用 FIFO 机制保存键值。可以检测 如下事件&#xff1a; 按键按下。 按键弹起。 长按键。 长按时自动连发。 我们将按键驱动分为两个部分来介绍&#xff…

Spark大数据处理学习笔记1.5 掌握Scala内建控制结构

文章目录 一、学习目标二、条件表达式&#xff08;一&#xff09;语法格式&#xff08;二&#xff09;执行情况&#xff08;三&#xff09;案例演示任务1、根据输入值的不同进行判断任务2、编写Scala程序&#xff0c;判断奇偶性 三、块表达式&#xff08;一&#xff09;语法格式…

电弧打火机方案,点烟器单片机开发方案

市面上的打火机除了明火之外&#xff0c;还有电热丝、电弧两种类型的点烟器。电热丝在使用过程中会变细并且烧断。宇凡微推出的电弧打火机方案&#xff0c;该点烟器芯片为宇凡微单片机YF系列&#xff0c;电弧点烟器IC性价比高。 一、电弧打火机方案的原理 电弧打火机使用的是电…

【git切换分支/tag】git stash保存暂不提交的更改

目录 问题git stash使用方法git stash pop 还原修改 git stash使用、修改指定tag的代码 其他git指令 问题 情景&#xff1a;分支1上开发新功能&#xff0c;临时切换到其他分支或tag上修改bug。 1、直接切换&#xff1a;如果没有冲突&#xff0c;分支1的修改会带到要切换的分支…

拉普拉斯方程解决有介质导体球壳问题

一个内径和外径分别为和的导体球壳&#xff0c;带电荷&#xff0c;同心地包围着一个的导体球&#xff0c;使这个导体球接地&#xff0c;求空间各点的电势和这个导体球的感应电荷 我们不难发现&#xff0c;球对称性非常强&#xff0c;电势只和半径有关系 所以我们可以假设电势为…

【GitLab】-HTTP Basic: Access denied.remote:You must use a personal access token

写在前面 本文简要说明GitLab配置accessToken以及双因子认证&#xff08;Two-factor authentication&#xff09;。 目录 写在前面一、场景描述二、具体步骤1.环境说明2.配置accessToken3.克隆项目4.双因子认证 三、参考资料写在后面 一、场景描述 在使用账号和密码的方式拉取公…

Alex-Net 与 VGG-16

Alex-Net 由加拿大多伦多大学的 Alex Krizhevsky、Ilya Sutskever(G. E. Hinton 的两位博士生)和 Geoffrey E. Hinton 提出&#xff0c;网络名“Alex-Net”即 取自第一作者名。 下图所示是 Alex-Net 的网络结构&#xff0c;共含五层卷积层和三层全连接层。其中&#xff0c;Ale…

【Vue3 生态】Vue Router 路由知识概览

前言 在 Web 前端开发中&#xff0c;路由是非常重要的一环&#xff0c;但是路由到底是什么呢&#xff1f; 从路由的用途上讲 路由是指随着浏览器地址栏的变化&#xff0c;展示给用户不同的页面。 从路由的实现原理上讲 路由是URL到函数的映射。它将 URL 和应用程序的不同部分…

01 React入门、虚拟DOM

总结 一、React 入门 1.1 特点 高性能、声明式、组件化、单向响应的数据流、JSX扩展、灵活 1.2 React初体验 <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewpo…

软件 安全,处理威胁STRIDE模型

微软威胁分析工具&#xff1a; https://www.microsoft.com/en-us/securityengineering/sdl/threatmodeling?azure-portaltrue STRIDE 是微软定义的6中威胁 身份假冒&#xff08;Spoofing&#xff09; 身份假冒&#xff0c;即伪装成某对象或某人。例如&#xff0c;我们通过伪…

1-简单回归问题

一.梯度下降&#xff08;gradient descent&#xff09; 1.预测函数 这里有一组样本点&#xff0c;横纵坐标分别代表一组有因果关系的变量 我们的任务是设计一个算法&#xff0c;让机器能够拟合这些数据&#xff0c;帮助我们算出参数w 我们可以先随机选一条过原点的直线&#xf…

无人机电池能不能上高铁以及什么型号的电池可以上高铁

无人机电池能不能上高铁以及什么型号的电池可以上高铁 高铁关于电池的限制电池参数介绍可上高铁的无人机锂电池6S电池3S电池 高铁关于电池的限制 2022年7月1日起施行的《铁路旅客禁止、限制携带和托运物品目录》规定,充电宝、锂电池单块额定能量不超过100Wh 电池参数介绍 明…

HarmonyOS学习路之开发篇—Java UI框架(DependentLayout)

DependentLayout DependentLayout是Java UI框架里的一种常见布局。与DirectionalLayout相比&#xff0c;拥有更多的排布方式&#xff0c;每个组件可以指定相对于其他同级元素的位置&#xff0c;或者指定相对于父组件的位置。 支持的XML属性DependentLayout的共有XML属性继承自…

SpringBoot不在使用@Validated 做参数校验但是不想在Controller层怎么办?

目录 场景再现&#xff1a; 怎么做&#xff1f; 遇到了什么问题&#xff1f; 怎么实现&#xff1f; 场景再现&#xff1a; 某API接口接受加密的json字符串&#xff0c;接受字符串之后先进行解密处理&#xff0c;解密完成之后还要进行参数校验处理&#xff0c;如果参数不合规…

使用 TensorFlow.js 将机器学习引入您的 Web 应用程序

如何使用 TensorFlow.js 在您的 Web 应用程序中实施机器学习 原文作者: Abhay Singh Rathore 机器学习 (ML) 不再是一个崇高、遥不可及的概念。借助 TensorFlow.js 等库&#xff0c;开发人员现在可以将 ML 整合到他们的 Web 应用程序中。例如&#xff0c;您可以创建一个系统&am…