记录一个导致队列无法正常执行的问题

不知道这算不算 Lavavel 需要改进的一个小问题,当队列实现了 ShouldBeUnique 接口时,如果这个队列类没有定义 uniqueId() 方法,也没有定义 uniqueId 属性时,那么这个任务将不会被派发执行。

具体现象就是当我们触发这个队列时,会执行队列的构造方法,但是不会触发任务执行,也不会报错。

相关源码 Illuminate\Bus\UniqueLock.php
   /**
     * Generate the lock key for the given job.
     *
     * @param  mixed  $job
     * @return string
     */
    protected function getKey($job)
    {
        $uniqueId = method_exists($job, 'uniqueId')
                    ? $job->uniqueId()
                    : ($job->uniqueId ?? '');

        return 'laravel_unique_job:'.get_class($job).$uniqueId;
    }

在这里我们能看到,如果既没有 uniqueId() 方法,也没有 uniqueId属性,那么 uniqueId 就是一个空字符串,那每个任务的唯一编号就是一样的了。

个人感觉,这部分要么应该 throw 一个异常,提示因为是现实了 ShouldBeUnique 接口,所以必须定义 uniqueId 方法或属性。要么正是有点懵,文档中的描述也是说只需要实现 ShouldBeUnique 即可,可以不用增加任何额外的方法。

奇怪 奇怪 真奇怪

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 7

這個沒有問題吧 如果沒有指定uniqueId 那就是代表鎖住這個job 同job 就不會被放入隊列 有這樣的業務需要用到這樣的場景 文檔上也說了這些情況的

file

1年前 评论
24K大白羊 (楼主) 1年前
cccdz (作者) 1年前
24K大白羊 (楼主) 1年前
cccdz (作者) 1年前

file

redis驅動的隊列源碼我看過了 如果已經加入到隊列了 是不會有限制的

1年前 评论

file

處理完後會把這個key 給釋放掉 他是通過這個key 去決定是否加入隊列的 如果存在key 則不會處理這個任務

1年前 评论

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