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
事件执行过程如下:
- 先执行
CapterAEventListener
,输出,抛出错误中断当前队列 - 继续执行
CapterBEventListener
,输出 - 重新执行
CapterAEventListener
,输出,抛出错误中断当前队列 - 再次执行
CapterAEventListener
,输出,抛出错误,达到重试最大次数,停止执行
问题:
我如何在CapterAEventListener
的handle
第一次抛出错误后,停止整个队列继续执行?如果是在同步的事件中,返回false
就不会继续执行了,但是异步队列事件,抛出错误仍旧会继续执行。而我希望的是在一开始抛出错误就停止RollEvent
所有异步事件侦听器继续执行
推荐文章: