操作环境 windows下的docker desktop
链接: docker desktop 下载地址
选择自己对应的版本进行下载
安装rabbitmq
# 拉rabbitmq 镜像
docker pull rabbitmq:management
# 运行容器
# 主要注意 15672 5672 两个端口 后边需要用到
docker run -d --name my-rabbitmq -p 15672:15672 -p 5672:5672 rabbitmq:management
# 运行完之后 浏览器测试 账号 guest 密码 guest 测试是否安装成功
http://localhost:15672/
需要使用延时队列 rabbitmq 安装对应的插件
- 进入rabbitmq命令行
# 更新apt
apt update
# 安装wget
apt install wget
# 下载对应的包
wget https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases/download/3.10.2/rabbitmq_delayed_message_exchange-3.10.2.ez
# copy包到指定位置
cp rabbitmq_delayed_message_exchange-3.10.2.ez /opt/rabbitmq/plugins/
# 运行命令生效 延时队列
rabbitmq-plugins enable rabbitmq_delayed_message_exchange
# 重启rabbitmq服务
- 出现对应的信息
安装hyperf
# -v D:\hyperf\rabbitmq:/data/project 切换成自己本地的地址
docker run --name hyperf-rabbitmq -v D:\hyperf\rabbitmq:/data/project -p 9501:9501 -it --privileged -u root --entrypoint sh hyperf/hyperf:7.4-alpine-v3.11-swoole
# 进入容器后 切换镜像这里使用阿里镜像没有安装成功 切换成腾讯镜像好了
composer config -g repos.packagist composer https://mirrors.cloud.tencent.com/composer/
# 进入文件夹内 创建项目 项目配置 全部默认回车就可以了 有兴趣的可以自己研究
cd /data/project
composer create-project hyperf/hyperf-skeleton
# 启动项目
cd hyperf-skeleton
php bin/hyperf.php start
# 验证hyperf安装成功
127.0.0.1:9501
安装amqp组件
# 根据文档安装组件
composer require hyperf/amqp
# 生成配置文件
php bin/hyperf.php vendor:publish hyperf/amqp
创建数据库 生成订单
-
这个数据库就是一些简单的字段可以完成我们的功能即可
-
订单模型
# 生成订单模型 这里也可以使用简单的DB类完成
php bin/hyperf.php gen:model hy_order
- 订单生成代码
<?php
declare(strict_types=1);
namespace App\Controller;
use App\Model\HyOrder;
class IndexController extends AbstractController
{
public function createOrder(){
$order = new HyOrder();
$order_data = [
'orderCode'=>time(),
'status'=>1
];
$order->orderCode = $order_data['orderCode'];
$order->status = $order_data['status'];
$order->save();
return "success";
}
}
根据hyperf文档下载demo文件
# 投递消息demo
php bin/hyperf.php gen:amqp-producer DelayDirectProducer
# 消息消费demo
php bin/hyperf.php gen:amqp-consumer DelayDirectConsumer
对DelayDirectProducer进行修改
根据hyperf文档进行修改就可以了 链接: hyperf文档地址
<?php
declare(strict_types=1);
namespace App\Amqp\Producer;
use Hyperf\Amqp\Annotation\Producer;
use Hyperf\Amqp\Message\ProducerMessage;
use Hyperf\Amqp\Message\ProducerDelayedMessageTrait;
use Hyperf\Amqp\Message\Type;
/**
* @Producer()
*/
class DelayDirectProducer extends ProducerMessage
{
use ProducerDelayedMessageTrait;
protected $exchange = 'ext.hyperf.delay';
protected $type = Type::DIRECT;
protected $routingKey = '';
public function __construct($data)
{
$this->payload = $data;
}
}
对IndexController进行修改
<?php
declare(strict_types=1);
/**
* This file is part of Hyperf.
*
* @link https://www.hyperf.io
* @document https://hyperf.wiki
* @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/
namespace App\Controller;
use App\Amqp\Producer\DelayDirectProducer;
use App\Model\HyOrder;
use Hyperf\Utils\ApplicationContext;
use Hyperf\Amqp\Producer;
class IndexController extends AbstractController
{
public function createOrder(){
$order = new HyOrder();
$order_data = [
'orderCode'=>time(),
'status'=>1
];
//发布到rabbitmq
$json = json_encode($order_data);
$message = new DelayDirectProducer($json);
$message->setDelayMs(10 * 1000);//定时10s
$producer = ApplicationContext::getContainer()->get(Producer::class);
$producer->produce($message);
//插入数据库
$order->orderCode = $order_data['orderCode'];
$order->status = $order_data['status'];
$order->save();
return "success";
}
}
对DelayDirectConsumer进行修改
<?php
declare(strict_types=1);
namespace App\Amqp\Consumer;
use Hyperf\Amqp\Result;
use Hyperf\Amqp\Annotation\Consumer;
use Hyperf\Amqp\Message\ConsumerDelayedMessageTrait;
use Hyperf\Amqp\Message\ConsumerMessage;
use Hyperf\Amqp\Message\ProducerDelayedMessageTrait;
use PhpAmqpLib\Message\AMQPMessage;
use App\Model\HyOrder;
use Hyperf\Amqp\Message\Type;
/**
* @Consumer( nums=1)
*/
class DelayDirectConsumer extends ConsumerMessage
{
use ProducerDelayedMessageTrait;
use ConsumerDelayedMessageTrait;
protected $exchange = 'ext.hyperf.delay';
protected $queue = 'queue.hyperf.delay';
protected $type = Type::DIRECT; //Type::FANOUT;
protected $routingKey = '';
public function consumeMessage($data, AMQPMessage $message): string
{
$data = json_decode($data,true);
var_dump($data);
if($data['orderCode']){
$order = new HyOrder();
//根据条件取消订单
$order = $order->where("orderCode","=",$data['orderCode'] )->where("status",1)->first();
if($order){
$order->status = 9;
$order->save();
}
}
return Result::ACK;
}
}
接下来运行代码 订单成功取消
希望对你有所帮助,感谢观看!