tp6安装并使用rabbitMQ

news2024/9/19 10:45:28

最近因为业务需要,要用到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 

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智能果树叶部疾病识别实践,基于HOG+SVM和轻量级的CNN模型分别开发构建苹果果树叶部疾病识别分析系统

在农业领域中&#xff0c;将机器学习和深度学习模型结合应用有着广泛的实用意义&#xff0c;在这块相关的实践中以往的项目开发实践则是主要集中在农作物种植相关的&#xff0c;今天本文的主要目的就是开发构建果树叶部疾病识别分析系统&#xff0c;这里是以苹果果树叶部疾病数…

springcloud环境搭建

目录 1、创建一个父项目 ​编辑 2、创建子项目 2.1创建订单系统-order ​编辑 2.2创建库存系统-stock 3、创建rest服务 3.1添加web依赖 3.2编写controller 3.3订单中需要调用库存中的扣减库存的接口 通过idea开发工具进行搭建 1、创建一个父项目 通过spring initializr…

Django基础入门:后台管理 超级用户 数据表注册操作③

Django基础入门&#xff1a;后台管理 超级用户 数据表注册操作③ Django Admin数据表后台管理超级用户数据表注册admin操作日志 &#x1f3d8;️&#x1f3d8;️个人简介&#xff1a;以山河作礼。 &#x1f396;️&#x1f396;️:Python领域新星创作者&#xff0c;CSDN实力新星…

使用randoop自动化生成测试用例

1. 综述 使用randoop自动化生成测试用例 2. 操作 下载randoop的jar包&#xff1b;将jar包和所要测试的类&#xff08;如Calculate.class&#xff09;放在同一个文件夹&#xff1b;在此文件夹打开命令行提示符&#xff0c;输入如下命令&#xff1a; java -ea -classpath .;ra…

嵌入式Linux驱动开发 05:阻塞与非阻塞

文章目录 目的基础说明开发准备驱动程序应用程序 O_NONBLOCK应用程序驱动程序程序演示 poll应用程序驱动程序程序演示 异步通知应用程序驱动程序程序演示 总结 目的 不管在应用开发还是驱动开发中阻塞和非阻塞都是绕不开的话题。这篇文章将介绍相关的基础内容。 这篇文章中内…

Redis命令-认识NoSQl和Redis常见的通用命令

1. 认识NoSQL 非关系型数据库 NoSQL是指一类非关系型数据库&#xff0c;它们采用的数据模型不同于传统的关系模型&#xff0c;它通常使用键值对、文档、图形等非传统的数据结构进行数据存储&#xff0c;不遵循预定义的模式和模型。NoSQL数据库通常分布式、高可扩展性&#xff0…

理解Java ThreadLocal

原文链接 理解Java ThreadLocal ThreadLocal是Java提供的为每个线程存储线程独立的数据的存储方式&#xff0c;也就是说用ThreadLocal来保存的数据&#xff0c;只能被当前线程所访问&#xff0c;其他线程无法访问&#xff0c;因为只有&#xff08;一个线程&#xff09;当前线程…

六级备考6天|CET-6|听力第五六讲|6月11日|19:44~20:07

目录 第五讲 第六讲 第五讲 第六讲 ​​​​​​​

支付宝认证的作用是什么?考试方向有哪些?

通过考证书来提升自己的能力&#xff0c;是现在的打工人经常会做的事&#xff0c;而对于从事信息通信技术行业的人来说&#xff0c;可以选择的证书非常多&#xff0c;其中支付宝认证是一个新设立的证书&#xff0c;但是实用性非常高。支付宝作为我们生活中常用的软件&#xff0…

arthas 的初使用

Arthas 是一款线上监控诊断产品&#xff0c;通过全局视角实时查看应用 load、内存、gc、线程的状态信息&#xff0c;并能在不修改应用代码的情况下&#xff0c;对业务问题进行诊断&#xff0c;包括查看方法调用的出入参、异常&#xff0c;监测方法执行耗时&#xff0c;类加载信…

PD QC诱骗取电应用IC《乐得瑞LDR6328S》广泛应用于各大小家电

随着现在智能家居的应用越来越广泛&#xff0c;带电池的产品一天比一天多&#xff0c;今天这篇文章就来讲一下那些支持快速充电(PD QC)的产品应用电路是怎么实现的 USB PD受电端取电芯片&#xff08;乐得瑞取电受电)LDR6328S 支持多协议快充取电&#xff01; 1、概述 LDR6328S…

推荐5款你可能没见过的效率软件

你有没有想过&#xff0c;有些软件能让你的电脑用起来更方便&#xff0c;更快&#xff0c;更好看&#xff1f;这篇文章就为你介绍了五款这样的软件&#xff0c;它们分别是BreeZip&#xff0c;ClipClip&#xff0c;燃精灵&#xff0c;Sticky Notes和Tabby。下面我们来看看它们都…

增强 Kubernetes 可观测性:API Server Tracing 特性已到达 Beta 版本

标题 在分布式系统中&#xff0c;很难弄清楚问题在哪里。 想象一个场景&#xff0c;这也是 Kubernetes 集群管理员最常遇到的问题&#xff0c;Pod 无法正常启动&#xff0c;这时候作为管理员&#xff0c;我们会先去思考这可能是哪个组件出了问题&#xff0c;然后去对应的组件查…

Parallel Desktop下的Centos 9 ping通网络,配置静态ip的全过程

目录 一、发现问题1. 找不到网卡配置文件2. 网络重启的命令一直无法执行成功 二、分析问题三、解决问题系统环境1. 打开网卡配置文件2. 修改ipv4配置3. 重载网卡配置文件4. ping通&#xff0c;可以正常上网了 四、疑问1. 如何确定自己是不是设置了静态ip2. DHCP是固定静态ip 的…

OC(iOS)中常见的面试题汇整(大全)

你如何理解OC这门语言的?谈一下你对OC的理解? OC语言是C语言的一个超集,只是在C语言的基础上加上了面向对象的语言特征,如:继承,封装,多态. 封装:把属性和方法封装成一个类,方便我们使用 多态:不同对象对于同一消息的不同响应,子类可以重写父类的方法,且…

SpringMVC简介及入门案例

1.SpringMVC简介 SpringMVC是一种基于Java实现MVC模型的轻量级Web框架优点&#xff1a;相较于Servlet使用简单&#xff0c;开发便捷。灵活性比较强。 后端做表现层技术开发的框架有Servlet&#xff0c;SpringMVC技术同样也是做表现层技术开发框架&#xff0c;JDBC以及Mybatis数…

Linux内核中内存管理相关配置项的详细解析6

接前一篇文章&#xff1a;Linux内核中内存管理相关配置项的详细解析5 六、Memory hotplug 此项只有选中和不选中两种状态&#xff0c;默认为选中。 此项展开后如下图所示&#xff1a; 1. Online the newly added memory blocks by default 对应配置变量为&#xff1a;CONFIG…

神经网络编程基础

1、二分类(Binary Classification) &#xff08;1&#xff09;、逻辑回归(logistic regression)是一个用于二分类(binary classification)的算法。所谓二分类是由输入到判断输出结果是或者不是。比如输入一个包含动物的图片&#xff0c;判断这张图片中的动物是否包含猫&#x…

成为优秀自动化测试工程师的7个步骤

在这里&#xff0c;我将详细解释成为测试自动化工程师的七个最重要的步骤。因此&#xff0c;所有希望将职业转向自动化测试的人都要注意所有这些。 1. 不要忽视手动测试 虽然我了解公司正在转向无代码自动化测试工具&#xff0c;达到专家级别并跟上行业自动化测试工程师的竞争…