Динамическое одноэлементное связывание Laravel не может быть разрешено работником очереди - PullRequest
1 голос
/ 12 июня 2019

В моем приложении Laravel я должен вызывать сторонние API-вызовы, поэтому я храню все детали, связанные со сторонними, в базе данных (URL и пароль и т. Д.). Чтобы сделать этот Клиент доступным для всех в приложении, я создал поставщика услуг

ServiceProvider.php

 $thirdParties = ThirdParty::all();

 collect($thirdParties)->each(function ($thirdParty) {
            $this->app->singleton(Str::snake($thirdParty->name), function ($app) use($thirdParty) {
                $config = new Config();
                $config->setLoginUrl($thirdParty->auth_url)
                    ->setUsername($thirdParty->username)
                    ->setPassword($thirdParty->password);
                $client = new Client($config);
                $client->Login();
                return $client;
            });
        });

Все работающие файлы, поскольку провайдер извлекает все Thrid Patry и регистрирует одноэлементный класс. Пользователь приложения также может добавить новую Стороннюю программу из пользовательского интерфейса, поэтому теперь для создания этого одиночного кода я поместил тот же код с одним $thirdParty.

.

Задача

Таким образом, когда новое стороннее приложение будет добавлено, оно отправит задание, в котором я использую тот же экземпляр Singleton того же класса. Но из-за динамического связывания в Laravel Container мой рабочий не знал, как решить эту проблему и начал терпеть неудачу.

PS: после перезапуска работника очереди все работает нормально.

Любая помощь или альтернативные способы приветствуются. Спасибо.

Ответы [ 2 ]

1 голос
/ 12 июня 2019

Как утверждает @Clemen, работник очереди - это долгоживущий процесс, это экземпляр PHP, и приложение уже загружено при развертывании приложения.

Я бы предложил вам запускать Artisan::call('queue:restart') каждый раз, когда ваша ThirdParty создает, обновляет и удаляет. Вы можете достичь этого, используя События модели или просто вручную, используя API (Контроллер).

Проблема возникает и при их обновлении, потому что учетные данные API останутся устаревшими, поэтому вам придется делать это при создании, обновлении и удалении.

Пример:

class ThirdParty extends Model
{

    protected static function boot()
    {
        parent::boot();
        static::creating(function (ThirdParty $thirdParty) {
            Artisan::call('queue:restart');
        });
        static::updating(function (ThirdParty $thirdParty) {
            Artisan::call('queue:restart');
        });
        static::deleted(function (ThirdParty $thirdParty) {
            Artisan::call('queue:restart');
        });
    }
}
1 голос
/ 12 июня 2019

Если вы запускаете своего работника очереди, он всегда работает в фоновом режиме (если у вас есть процесс мониторинга, такой как Supervisor), поэтому он регистрирует синглтоны в первый раз, если после этого вы добавляете больше сторонних, он не будет загружатьсячто нибудь еще.По этой причине, когда вы перезапускаете работника очереди, он начинает работать.

Этот совет вы можете увидеть в документации Laravel, https://laravel.com/docs/5.8/queues#running-the-queue-worker

Помните, что работники очереди являются долгоживущими процессами и хранилищемсостояние загруженного приложения в памяти.В результате они не заметят изменений в вашей кодовой базе после их запуска.Поэтому во время процесса развертывания обязательно перезапустите работников очереди.

Надеюсь, это поможет вам.

С уважением.

...