Laravel如何停止异步事件队列

先写个简单的例子

EventServiceProvider中添加一个事件和两个异步侦听器(再次说明一下,是异步队列ShouldQueue,不是同步的)

        'App\Events\Test\RollEvent' => [
            'App\Listeners\Test\CapterAEventListener',
            'App\Listeners\Test\CapterBEventListener',
        ],

CapterAEventListener输出一行命令,并抛出错误

    public function handle(RollEvent $event)
    {
        echo 'RoolEventA'.PHP_EOL;
        throw new TaskException('testA');
    }

    public  function  failed(RollEvent  $event, $exception) 
    {
        dump($exception);
    }

CapterBEventListener输出一行命令

    public function handle(RollEvent $event)
    {
        echo 'RoolEventB'.PHP_EOL;
    }

tinker中执行事件

event(new App\Events\Test\RollEvent)

在pm2中监控结果如下:

> [2022-03-24 15:30:40][yMICB1wuiz1vGVPOTExspfTJnegZIcNt] Processing: App\Listeners\Test\CapterAEventListener
> RoolEventA
> [2022-03-24 15:30:40][htYbO4KZjRTucow0sWVHSGebjbHOCOfP] Processing: App\Listeners\Test\CapterBEventListener
> RoolEventB
> [2022-03-24 15:30:40][htYbO4KZjRTucow0sWVHSGebjbHOCOfP] Processed: App\Listeners\Test\CapterBEventListener
> [2022-03-24 15:30:43][yMICB1wuiz1vGVPOTExspfTJnegZIcNt] Processing: App\Listeners\Test\CapterAEventListener
> RoolEventA
> [2022-03-24 15:30:46][yMICB1wuiz1vGVPOTExspfTJnegZIcNt] Processing: App\Listeners\Test\CapterAEventListener
> RoolEventA
> App\Exceptions\TaskException {#2116
> }
> [2022-03-24 15:30:46][yMICB1wuiz1vGVPOTExspfTJnegZIcNt] Failed:  App\Listeners\Test\CapterAEventListener

事件执行过程如下:

  1. 先执行CapterAEventListener,输出,抛出错误中断当前队列
  2. 继续执行CapterBEventListener,输出
  3. 重新执行CapterAEventListener,输出,抛出错误中断当前队列
  4. 再次执行CapterAEventListener,输出,抛出错误,达到重试最大次数,停止执行

问题:

我如何在CapterAEventListenerhandle第一次抛出错误后,停止整个队列继续执行?如果是在同步的事件中,返回false就不会继续执行了,但是异步队列事件,抛出错误仍旧会继续执行。而我希望的是在一开始抛出错误就停止RollEvent所有异步事件侦听器继续执行

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
最佳答案
    public function handle(RollEvent $event)
    {
        echo 'RoolEventB'.PHP_EOL;
    }
    public function fail($exception = null)
    {

        //错误后操作
        //$this->delete();


    }
3年前 评论
bigdaxin (作者) 3年前
levi (楼主) 3年前
levi (楼主) 3年前
bigdaxin (作者) 3年前
levi (楼主) 3年前
讨论数量: 8
    public function handle(RollEvent $event)
    {
        echo 'RoolEventB'.PHP_EOL;
    }
    public function fail($exception = null)
    {

        //错误后操作
        //$this->delete();


    }
3年前 评论
bigdaxin (作者) 3年前
levi (楼主) 3年前
levi (楼主) 3年前
bigdaxin (作者) 3年前
levi (楼主) 3年前
xiaopi

可以换一种思路,使用链式Job。一条链上的,第一个执行失败了,就不会执行后面的了。

3年前 评论
levi (楼主) 3年前

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