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

事件代码

<?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
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案
  1. 环境里的QUEUE_CONNECTION=redis要和监听器中的$connection = ‘redis’;一致。
  2. 消费时要指定队列名称。如
    php artisan queue:work --queue=wechatMemberViewTags,wechatMemberView
    感谢大佬们的指点@chowjiawei @pianzhou2021 @vinhson @jehu @caijunduo
2年前 评论
讨论数量: 14
chowjiawei

dispatchNow立即执行 先排查问题

2年前 评论
daichongweb (楼主) 2年前

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

2年前 评论
daichongweb (楼主) 2年前
pianzhou2021 (作者) 2年前

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

2年前 评论
daichongweb (楼主) 2年前

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

2年前 评论
daichongweb (楼主) 2年前

一步步排查

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

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