Как установить имя очереди слушателя из переменной среды? - PullRequest
0 голосов
/ 08 марта 2019

Я только что заметил, что некоторые из моих слушателей не используют очередь, которую я ожидал, что они будут использовать.Наша команда обновилась с Laravel 5.2 до 5.5 несколько недель назад, и я думаю, что именно тогда проблема начала возникать.В системе не было большой нагрузки, поэтому я обнаружил ее только случайно.

В любом случае.Я использовал для задания имени очереди на слушателе с помощью метода очереди, например так:

public function queue(QueueManager $handler, $method, $arguments): void
{
    $handler->connection()->push($method, $arguments, Queue::getNotificationQueue());
}

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

Итак, я посмотрел документацию https://laravel.com/docs/5.5/events#queued-event-listeners,, в которой говорится, что имя должно быть установлено в свойстве очереди прослушивателя.Моя проблема в том, что у меня есть имя очереди в переменной окружения, поэтому я не могу просто установить его непосредственно как свойство, как показано в документации, и это не работает для его установки в конструкторе, например:

protected $queue;

public function __construct()
{
    $this->queue = Queue::getNotificationQueue();
}

Кто-нибудь здесь имеет представление о том, как я могу обойти это?

1 Ответ

1 голос
/ 08 марта 2019

В частности, для очередей SQS свойство $queue ведет себя немного странно, потому что оно, похоже, не относится к очередям, определенным в queue.php, но ожидает полный URL-адрес очереди, поэтому даже приведенный в документации пример выглядит не так.

Но для динамических имен очереди в слушателях событий в очереди, которые, например, меняются в зависимости от среды, создание пользовательских SqsConnector и SqsQueue будет одним из способов решения вашей проблемы.

ВотПример реализации

class CustomSqsQueueServiceProvider extends ServiceProvider
{
    public function register(): void
    {
        $this->app->booted(function () {
            $this->app['queue']->extend('custom_sqs', function () {
                return new CustomSqsConnector;
            });
        });
    }
}

А затем в вашем queue.php ваш драйвер подключения SQS по умолчанию от sqs до custom_sqs

...