事件系统使用队列无法执行

事件代码

<?php

namespace App\Events;

use App\Models\PostsModel;
use App\Models\WechatMembers;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

/**
 * 微信用户浏览素材事件
 */
class WechatMemberViewEvent
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    /**
     * 素材
     * @var PostsModel
     */
    public $post;

    /**
     * 当前用户
     * @var WechatMembers
     */
    public $currentUser;

    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct(WechatMembers $wechatMember, PostsModel $post)
    {
        $this->currentUser = $wechatMember;
        $this->post = $post;
    }
}

监听器代码

<?php

namespace App\Listeners;

use App\Events\WechatMemberViewEvent;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Support\Facades\Redis;

/**
 * 微信用户浏览文章监听器
 */
class WechatMemberViewListener implements ShouldQueue
{
    /**
     * 任务将被发送到的连接的名称。
     *
     * @var string|null
     */
    public $connection = 'redis';

    /**
     * 任务将被发送到的队列的名称。
     *
     * @var string|null
     */
    public $queue = 'listeners';

    /**
     * 任务被处理的延迟时间(秒)。
     *
     * @var int
     */
    public $delay = 1;

    /**
     * Handle the event.
     *
     * @param WechatMemberViewEvent $event
     * @return void
     */
    public function handle(WechatMemberViewEvent $event)
    {
        info($event->post);
    }

    public function viaQueue(): ?string
    {
        return $this->queue;
    }
}

触发事件

  WechatMemberViewEvent::dispatch($request->user(), $info);

监听队列

 php artisan queue:work

一系列操作下来后也没生成日志,queue:default里是用内容的。不知道哪里出了问题,求大佬指教。。

事件系统使用队列无法执行

DaiChongWeb
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
最佳答案
  1. 环境里的QUEUE_CONNECTION=redis要和监听器中的$connection = ‘redis’;一致。
  2. 消费时要指定队列名称。如
    php artisan queue:work --queue=wechatMemberViewTags,wechatMemberView
    感谢大佬们的指点@chowjiawei @pianzhou2021 @vinhson @jehu @caijunduo
1周前 评论
讨论数量: 14
chowjiawei

dispatchNow立即执行 先排查问题

1周前 评论
DaiChongWeb (楼主) 1周前

楼上正解,先排查问题,另外,之前有遇到过,如果程序中有exit之类的操作,或者有报错的command的,也会导致上述问题

1周前 评论
DaiChongWeb (楼主) 1周前
pianzhou2021 (作者) 1周前

你的队列名不是:listeners
执行 php artisan queue:work --queue=listeners 试试

1周前 评论
DaiChongWeb (楼主) 1周前

先不要运行消费者,连上 redis 看看任务能不能正常分发

1周前 评论
DaiChongWeb (楼主) 1周前

一步步排查

  • 去掉队列,看事件和监听器是否正常运行
  • 加上队列(不指定队列名和连接),走默认队列,看是否正常运行
  • 指定队列名和连接,看是否正常运行
1周前 评论
DaiChongWeb (楼主) 1周前
caijunduo (作者) 1周前
DaiChongWeb (楼主) 1周前
  1. 环境里的QUEUE_CONNECTION=redis要和监听器中的$connection = ‘redis’;一致。
  2. 消费时要指定队列名称。如
    php artisan queue:work --queue=wechatMemberViewTags,wechatMemberView
    感谢大佬们的指点@chowjiawei @pianzhou2021 @vinhson @jehu @caijunduo
1周前 评论

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