两个项目用消息队列通信

1.需求

项目A发送任务到队列,项目B消费任务执行业务操作

2.注意点

1.两个项目需要同一个queue的connection
2.任务生产者和任务订阅者配置同一个队列名称{queue}
3.任务生产者和任务订阅者有一个相同的job,类名和配置一样,不一样的是handle里面的内容。
4.任务订阅者监听的时候要指定参数–queue={queue}
5.为了减少代码耦合度,消息使用数组而不要使用具体对象

3. 项目A

3.1 OrderJob

<?php

namespace App\Jobs;

class NewOrderJob extends Job
{

    public $queue = 'new_order';
    public $data;

    public function __construct(array $data)
    {
        $this->data = $data;
    }

    public function handle()
    {
        echo "不会执行";
    }

}

3.2 发布任务

 dispatch(new NewOrderJob(["a" => "b"]));

4 项目B

<?php

namespace App\Jobs;

class NewOrderJob extends Job
{

    public $queue = 'new_order';
    public $data;

    public function __construct(array $data)
    {
        $this->data = $data;
    }

    public function handle()
    {
        dump($this->data);

        echo "项目B执行NewOrderJob";
    }

}

4.1 监听任务

php artisan queue:work --queue=new_order

#...
#项目B执行NewOrderJob[2020-03-15 17:28:37]
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 3

如果两个项目需要使用队列。建议需要修改下底层代码。不能使得两个项目都依赖于 Laravel 的数据结构。 而是应该自定义好数据结构。两个项目是实现它

4年前 评论
嘴里起了个泡 (楼主) 4年前
xin6841414

我用的rabbitmq, 代码也是楼主的这样, 委屈rabbitmq了,楼上的建议很好,就是不会改,唉, 流下了没技术的眼泪 :joy:

4年前 评论
嘴里起了个泡 (楼主) 4年前

直接使用Queue:push()这样就能解决laravel自带的命令空间问题了,我们一直用的是rabbitmq

4年前 评论
hiword (作者) 4年前
嘴里起了个泡 (楼主) 4年前
嘴里起了个泡 (楼主) 4年前
cboy868 4年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!