laravel 事件分发到不同队列,并监听其他项目队列完整

背景和目的

项目使用,laravel 5.6;队列 redis;
测试环境一台服务器部署了多个相同的项目,导致项目间的队列调用起了冲突;并且系统定时任务只关联了其中一个项目的schedule,其他项目的队列控制都依存于这一个项目。

laravel 事件分发到不同队列

官网上事件文档中没有描述这儿的事件指定队列名的动作,只在 队列文档中描述了,job 任务分发的 onQueue() 指定不同队列名,但由于继承的是同样的接口ShouldQueue,正常应该是可以调用起来的,就结果来说也是可以调用起来的。

源码调用部分

Illuminate/Events/Dispatcher.php
由于我们知道 队列是通过 queue名称来指定队列名的,所以针对性的找到了这儿的内容,所以只要调用的 listener 内容是包含queue属性的就可以了;
laravel 事件分发到不同队列,并监听其他项目队列完整_第1张图片
正常是可以了,只要在listener中设置固定属性值,希望调用哪个队列名就设置对应的属性名;但我比较特殊,我需要在一个项目中根据不同的 环境变量配置调用不同的队列名,所以,需要做进一步的设置

listener代码示例

laravel 事件分发到不同队列,并监听其他项目队列完整_第2张图片
最后多了 魔术函数 __get(),在调用尝试获得 queue变量时,从环境变量中获得对应的属性值,这样就可以做到将队列名进行配置处理。

补充

队列启动时要 加上对应的 队列名配置处理,具体查看 官方 队列关联文档。举例:
/usr/bin/php /var/www/mypro/artisan queue:work --queue=default,mytask --tries=2
这儿就是对 default,和mytask 做监听处理,区分先后顺序。

在一个项目中做定时任务监听其他项目的队列是否开启

正常应该没有这么做的,我就简单描述下,不细说了,我写了个shell脚本,laravel的任务调度(schedule)每分钟执行一次这儿的脚本,他会做队列是否存在的检查,按照不同的项目使用不同的 队列名(queue) 监听启动;但会遇到的问题是,在项目A中做schedule调度启动的关联项目B的队列,他是依存于项目A的环境变量的,所以,在队列启动时,还需要做环境变量的调整。

你可能感兴趣的:(工作记录)