tp8 使用rabbitMQ(1)简单队列

php8.0 使用 rabbitmq 要使用 3.6版本以上的, 并且还要开启 php.ini中的 socket 扩展

在这里插入图片描述
php think make:command SimpleMQProduce //创建一个生产者命令行
php think make:command SimpleMQConsumer //创建一个消费者命令行

在这里插入图片描述

在这里插入图片描述

代码中的消息持久化的说明

RabbitMQ 消息持久化
持久化是为提高rabbitmq消息的可靠性,防止在异常情况(重启,关闭,宕机)下数据的丢失。设置完队列和消息的持久化,并不能完全保证消息不会丢失。尽管它告诉 RabbitMQ 将消息保存到磁盘,但当 RabbitMQ 接受消息但尚未保存消息时,仍有一个较短的时间窗口。另外, RabbitMQ 不会对每条消息都执行 fsync(2) – 它可能只是保存到缓存中,而不是真正写入磁盘。持久性保证并不强,但对于我们的简单任务队列来说已经足够了。如果您需要更强的保证,则可以使用发布者确认(RabbitMQ 消息确认机制)

生产者代码

<?php
declare (strict_types = 1);

namespace app\command;

use ba\Exception;
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
use think\console\Command;
use think\console\Input;
use think\console\input\Argument;
use think\console\input\Option;
use think\console\Output;

//本类是模式中的 生产者 produce
class SimpleMQProduce extends Command
{
    protected function configure()
    {
        // 指令配置
        $this->setName('SimpleMQ')
            ->setDescription('这是一个队列的 Hello模式 (最简单的应用模式),使用了默认的交换机,只需要建一个队列就可以了');
    }

    protected function execute(Input $input, Output $output)
    {
        //获取连接
        $connection = $this->connectRabbitMQ();
        //获取连接的通道
        $channel = $connection->channel();
        //直接创建一个队列
        /**
         * 关于 queue_declare参数的说明
         * params  queue  队列的名称
         * params  passive 是否消极的声明队列,如果存在,就把队列的信息返回, 如果没有就抛出错误,(是的, 你没看错,这个参数很鸡肋,所以一般为 false)
         * params  durable 是否持久化,意思是说就算队列服务挂了, 也不会丢失队列
         * params  exclusive  是否排外,如果设置为true ,表示只有本次连接中的channel 可以访问,其它channel 是不可以访问的
         * params  auto_delete  设置是否自动删除。为true 则设置队列为自动删除。自动删除的前提是, 至少有一个消费者连接到这个队列,之后所有与这个队列连接的消费者都断开时,才会自动删除
         * params  nowait 相当于做一个异步版的声明, 如果设置成true, 就是说方法调用完就结束,也不用等待创建队列是否成功,一般也设为false
         */
        $channel->queue_declare("hello",false,false,false,false,false);
        for ($i = 0; $i < 20; $i++) {
            $message = ["name"=>"huang".$i,"age"=>$i,"sex"=>"man".$i];
            $msg = new AMQPMessage(json_encode($message),[
            "delivery_mode"=>AMQPMessage::DELIVERY_MODE_PERSISTENT          //使消息持久化
            ]);
            $channel->basic_publish($msg,"",'hello');  //简单模式下,routing_key 和 队列名称是一样的
            sleep(1);
        }

        //生产者调用完成后要关闭资源
        $channel->close();

    }


    //这个方法是建立一个 rabbitMQ 的资源连接
    protected function connectRabbitMQ(){
        try{
            $connection = new AMQPStreamConnection("192.168.3.228",'5672',"admin","123456");
            return $connection;
        }catch(Exception $e){
            throw new Exception("队列连接失败");
        }


    }

}


消费者代码

<?php
declare (strict_types = 1);

namespace app\command;

use ba\Exception;
use PhpAmqpLib\Connection\AMQPStreamConnection;
use think\console\Command;
use think\console\Input;
use think\console\input\Argument;
use think\console\input\Option;
use think\console\Output;

class SimpleMQConsumer extends Command
{
    protected function configure()
    {
        // 指令配置
        $this->setName('simplemqconsumer')
            ->setDescription('这是rabbitMQ的简单模式的消费者代码');
    }

    protected function execute(Input $input, Output $output)
    {
        //创建一个资源连接
        $connection = $this->connectRabbitMQ();
        $channel = $connection->channel();
        //定义一个处理函数
        $callback = function($msg){
            $body = $msg->body;
            $bodyArr = json_decode($body,true);
            echo $bodyArr["name"] ."--".$bodyArr["age"]. "--".$bodyArr["sex"];
        };
        //声明队列,这个函数的 passive ,如果有不返回这个队列的信息,如果没有就抛出异常
        $channel->queue_declare("hello",false,false,false,false,false);
        //从队列中消费数据
                /**
         * 参数说明
         * params queue 队列名称
         * params consumer_tag 消费者标签
         * params no_local AMQP标准  RabbitMQ没有实现, 默认为false
         * params no_ack 收到消息后是否不需要回复 如果为true表示不回复, 一般是要回复的 设置为 false
         * params exclusive 排他消费,即这个队列只能由一个消费者来消费
         * params nowait 相当于一个异步,在执行完成之后返回结果,不堵塞
         * params callback 处理消息的回调方法
         */
        $channel->basic_consume("hello",'',false,true,false,false,$callback);
        //等待队列执行完成
        while(count($channel->callbacks)){
            $channel->wait();
        }

    }

    //这个方法是建立一个 rabbitMQ 的资源连接
    protected function connectRabbitMQ(){
        try{
            $connection = new AMQPStreamConnection("192.168.3.228",'5672',"admin","123456");
            return $connection;
        }catch(Exception $e){
            throw new Exception("队列连接失败");
        }

    }
}

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

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

相关文章

测试开发(二) 开发chrome插件,提升测试效率

chrome插件截图 功能说明 自定义拦截请求response数据、并根据需要做解析&#xff0c;方便检查数据&#xff0c;提升测试效率。 chrome插件截图 功能说明 自定义修改请求的header、接口返回的response的header&#xff0c;提升模拟请求的效率&#xff0c;进而提升测试效率。…

奥特曼重返CEO之位!AI发展成硅谷巨头与保守科学家权力之争

OpenAI&#xff0c;一家因ChatGPT而闻名的人工智能公司&#xff0c;近日陷入了一场激烈的权力之争。创始人兼CEO山姆奥特曼&#xff08;Sam Altman&#xff09;突然离职&#xff0c;引发了一系列连锁反应。然而&#xff0c;在经过一番波折和谈判后&#xff0c;奥特曼最终重返Op…

【C++初阶】第一站:C++入门基础(中)

前言&#xff1a; 这篇文章是c入门基础的第一站的中篇,涉及的知识点 函数重载:函数重载的原理--名字修饰 引用:概念、特性、使用场景、常引用、传值、传引用效率比较的知识点 目录 5. 函数重载 &#xff08;续&#xff09; C支持函数重载的原理--名字修饰(name Mangling) 为什么…

深兰科技“汉境”入选2023年湖北省人工智能十大优秀应用案例

11月18日&#xff0c;央视“专精特新制造强国”城市大会在湖北武汉召开。会上&#xff0c;正式发布了“湖北省工业互联网标识十大优秀应用案例”&#xff0c;由深兰科技(武汉)股份有限公司基于AIGC多模态融合大模型技术开发打造的江汉路步行街元宇宙场景应用——汉境&#xff0…

广告机/商业显示屏_基于MT8788安卓主板方案

安卓主板在广告机领域扮演着重要的角色。无论是在商场、车站、酒店、电梯、机场还是高铁站&#xff0c;LED广告机广泛应用&#xff0c;并通过不同方式进行播放和管理。 广告机/商业显示屏_基于MT8788安卓主板方案 基于MT8788安卓主板方案的广告机采用了联发科MT8788八核芯片方案…

深入了解Java8新特性-日期时间API

阅读建议 嗨&#xff0c;伙计&#xff01;刷到这篇文章咱们就是有缘人&#xff0c;在阅读这篇文章前我有一些建议&#xff1a; 本篇文章大概2000多字&#xff0c;预计阅读时间长需要3分钟。本篇文章的实战性、理论性较强&#xff0c;是一篇质量分数较高的技术干货文章&#x…

I Doc View在线文档预览系统RCE漏洞(QVD-2023-45061)

0x01 产品简介 iDocView是一个在线文档解析应用&#xff0c;旨在提供便捷的文件查看和编辑服务。 0x02 漏洞概述 漏洞成因 本次漏洞出现在在线文档解析应用中的远程页面缓存功能。具体问题在于该应用未能对用户输入的URL进行充分的安全验证&#xff0c;从而导致存在安全隐患…

permission is only granted to system apps 权限错误提示处理

permission is only granted to system apps 消除清单文件中的权限Permission is only granted to system apps 错误 在manifest文件中我们注册一些权限&#xff0c;当我们用到某些权限是会有一个错误提示&#xff1a;Permission is only granted to system apps&#xff0c;该…

SpringBoot_websocket实战

SpringBoot_websocket实战 前言1.websocket入门1.1 websocket最小化配置1.1.1 后端配置1.1.2 前端配置 1.2 websocket使用sockjs1.2.1 后端配置1.2.2 前端配置 1.3 websocket使用stomp协议1.3.1 后端配置1.3.2 前端配置 2.websocket进阶2.1 websocket与stomp有什么区别2.2 webs…

HarmonyOS开发(六):构建简单页面

1、Column&Row组件 1.1、概述 一个页面由很多组件组成&#xff0c;如果需要把这些组件组织起来布局好&#xff0c;需要借助容器组件来实现。 容器组件是一种特殊的组件&#xff0c;它可以包含其他组件&#xff0c;而且按照一定的规律布局&#xff0c;一个容器组件中可以…

idea 2023 安装配置 Gradle8.4

官网&#xff1a;https://gradle.org 下载 Gradle8.4 https://gradle.org/releases/ 解压到本地&#xff0c;到 gradle-8.4\init.d 目录下新建文件&#xff1a;init.gradle 这里有个坑&#xff0c;编译报http协议安全的问题&#xff0c;解决办法&#xff0c;加入&#xff1…

便携式心电图机方案_基于MT6735平台的手持心电图机

便携式心电图机具备体积小、易携带、兼容12导模式的特点&#xff0c;通过工频滤波、基线滤波和肌电滤波等处理&#xff0c;能够获得更精准的心电图谱。该设备可以与医院信息系统(HIS)相连接&#xff0c;实现患者信息的共享。采集的心电数据可以通过无线方式发送到心电判读平台&…

2024年的云趋势:云计算的前景如何?

本文讨论了2024年云计算的发展趋势。 适应复杂的生态系统、提供实时功能、优先考虑安全性和确保可持续性的需求正在引领云计算之船。多样化的工作负载允许探索通用的公共云基础设施范例之外的选项。由于需要降低成本、提高灵活性和降低风险&#xff0c;混合云和多云系统越来越受…

vue项目引入中国地图

先安装有china.js的版本 npm install echarts4.8 --save //以前的版本有china.js <template><div class"mapMain"><div id"map" style"width: 30vw; height: 30vw;" /></div> </template><script>//引入文…

openGauss学习笔记-130 openGauss 数据库管理-参数设置-重设参数

文章目录 openGauss学习笔记-130 openGauss 数据库管理-参数设置-重设参数130.1 背景信息130.2 GUC参数设置130.3 操作步骤130.4 示例 openGauss学习笔记-130 openGauss 数据库管理-参数设置-重设参数 130.1 背景信息 openGauss提供了多种修改GUC参数的方法&#xff0c;用户可…

js实现获取原生form表单的数据序列化表单以及将数组转化为一个对象obj,将数组中的内容作为对象的key转化为对象,对应的值转换为对象对应的值

1.需求场景 哈喽 大家好啊&#xff0c;今天遇到一个场景&#xff0c; js实现获取原生form表单的数据序列化表单以及将数组转化为一个对象obj&#xff0c;将数组中的内容作为对象的key转化为对象&#xff0c;对应的值转换为对象对应的值 数组对象中某个属性的值&#xff0c;转…

行情分析 - - 加密货币市场大盘走势(11.23)

大饼昨日又开始了回调&#xff0c;因为FTF消息&#xff0c;而实际还是要下跌的&#xff0c;耐心等待即可。 空单策略&#xff1a;入场37300 止盈34000-33000 止损39000 以太昨日上涨也很激励&#xff0c;目前上涨打了止损&#xff0c;现在入场是好的机会&#xff0c;等待即可。…

经营现金流转正,宝尊电商解构内容电商3.0时代长期价值

在过去的“黄金十年”里&#xff0c;货架电商、直播电商鱼贯而出&#xff0c;接力式地推动品牌增长。彼时&#xff0c;价格换市场、“以快打快”的打法足以满足品牌发展所需。 然而&#xff0c;随着流量红利消退&#xff0c;消费者愈发理性&#xff0c;品牌增长集体“失速”。…

《图解Java数据结构与算法:微课视频版》简介

本书系统、全面地介绍数据结构的基础理论与算法设计&#xff0c;精选数据结构考研习题和各类典型例题进行讲解&#xff0c;案例和课后习题丰富&#xff0c;突出对数据结构算法实践能力的培养。本书算法均采用Java语言实现&#xff0c;示例代码可直接上机运行。 本书配套资源丰…