Laravel:在排队事件监听器

时间:2018-04-17 14:46:36

标签: php laravel laravel-5.6

我有一个基本的Laravel设置:

  • 队列驱动程序:beanstalkd
  • 数据库:Mysql

我有一个事件,在注册event (new UserRegistered($user_id))后会触发。

class UserRegistered
{
    use Dispatchable, InteractsWithSockets, SerializesModels;
    private $user_id;

    /**
     * Create a new event instance.
     *
     * @param $user_id
     */
    public function __construct($user_id)
    {
        $this->user_id = $user_id;
    }

    /**
     * @return mixed
     */
    public function getUserId()
    {
        return $this->user_id;
    }
}

该事件的事件侦听器实现ShouldQueue,因此它由队列处理。

EventListener@handle方法上,我使用$user = User::find($event->getUserId());

查询数据库
class UserRegisteredListener implements ShouldQueue
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  UserRegistered  $event
     * @return void
     */
    public function handle(UserRegistered $event)
    {
        $user = User::find($event->getUserId());

        if (is_null($user)) {
            Log::info($event->getUserId());
            Log::error("User not found");

            return;
        }

        // Some work
    }
}

问题:

有时(100/1000之一)User::find返回null而不是记录,但我确信这样的记录存在于数据库中!

用户ID没问题,我在此查询后立即将其记录到日志文件中,并将其现有用户ID。

为什么有时候记录在数据库中找不到的任何想法(当存在时)?

我终于找到了解决方案:

我在注册服务中有DB::beginTransactionDB::commit次来电。事件被解雇之前 DB::commit来电,因此首先是race condition或事件是commit

0 个答案:

没有答案