Как установить электронную почту с высоким, низким и средним приоритетом с помощью очереди?

Я изучаю Отправка задания отсюда

Проблема

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

Запрос Cmd

Я использую команду: php artisan queue: listen для обработки задания.

Что я пробовал?

php artisan queue:work --queue=high,default

но этот код никогда не работает, если параметр очереди подключения имеет значение не высоко

Драйвер очереди по умолчанию

'default' => env('QUEUE_DRIVER', 'database'),

Подключения к очереди

'connections' => [

    'Register' => [
        'driver'        =>  'database',
        'table'         =>  'tbljobs',
        'queue'         =>  'low',
        'retry_after'   =>  5,
    ],

    'ForgotPassword' => [
        'driver'        =>  'database',
        'table'         =>  'tbljobs',
        'queue'         =>  'low',
        'retry_after'   =>  5,
    ],

],

.env

QUEUE_DRIVER=Register

Код контроллера для регистрации электронной почты

$job = (new SendActivationEmail($Data))
        ->onConnection('Register');
dispatch($job);

Код контроллера для Reset Пароль

$job = (new SendResetPasswordEmail($this->tokens->create($user), $user))
        ->onConnection('ForgotPassword');
dispatch($job);

Ответ 1

Обратите внимание на Подключения Vs. Очереди отмечают в документации о очереди Laravel, которая применима ко всем драйверам очереди, кроме SQS, насколько мне известно.

Прежде чем начинать работу с очередей Laravel, важно понять различие между "соединениями" и "очередями". В вашей config/queue.php, есть соединения конфигурации. Этот параметр определяет конкретное соединение с такие как Amazon SQS, Beanstalk или Redis. Однако любые данное соединение в очереди может иметь несколько "очередей", которые могут быть рассмотрены как разные стеки или груды заданий в очереди.

Обратите внимание, что каждый пример конфигурации подключения в очереди файл конфигурации содержит атрибут очереди. Это значение по умолчанию очередь, на которую будут отправляться задания, когда они отправляются на заданный подключение. Другими словами, если вы отправляете задание без явно определяя, в какую очередь он должен быть отправлен, задание будет помещается в очередь, которая определена в атрибуте очереди Конфигурация соединения:

Фактически вы зарегистрируете одно соединение в очереди в файле config/queues.php, а параметр default будет просто очередью, по которой задания отправляются по умолчанию, если другая очередь не предоставляется.

Ответ Виталия выше будет правильным подходом к проблеме (объединиться к единственному соединению с очередью по умолчанию), затем при необходимости отредактируйте свои задания для отправки в разные очереди. Это важный (я думаю) контекст того, как работает конфигурация очереди.

Ответ 2

В вашем файле config/queue.php должны быть две очереди. Скажем, один с названием "высокий", а другой "низкий".

Затем вы можете отправить задания им по мере необходимости:

$job = (new SendResetPasswordEmail($this->tokens->create($user), $user))
        ->onConnection('ForgotPassword');
dispatch($job)->onQueue('high'));

Примечание: ->onQueue('high')

Наконец, вы должны запустить: php artisan queue:work --queue=high,low

Это запустит работника, который будет обрабатывать все задания в "высокой" очереди, прежде чем перейти к заданиям "низкий".

Ответ 3

'connections' => [

    'Register' => [ //<this name is connection name
        'driver'        =>  'database',
        'table'         =>  'tbljobs',
        'queue'         =>  'low',  //<this name is default queue name then you register a queue using this connection
        'retry_after'   =>  5,
    ],
],

Я предлагаю вам изменить свой код следующим образом:

'connections' => [
    'Register' => [
        'driver'        =>  'database',
        'table'         =>  'tbljobs',
        'queue'         =>  'default',
        'retry_after'   =>  5,
    ],
],

Высокоприоритетное задание - Код контроллера для регистрации электронной почты

$job = (new SendActivationEmail($Data))
        ->onConnection('Register')
        ->onQueue("high");
dispatch($job);

Среднее приоритетное задание - Код контроллера для Reset Пароль

$job = (new SendResetPasswordEmail($this->tokens->create($user), $user))
        ->onConnection('Register')
        ->onQueue("medium");
dispatch($job);

Низкоприоритетное задание

dispatch((new LowPriorityJob())->onQueue("low"));

Приоритетное задание по умолчанию

dispatch((new DefaultPriorityJob()));

- > onConnection ('Register')//эта строка полезна, если вы указываете, что по умолчанию установлено соединение. Зарегистрируйтесь в .env QUEUE_DRIVER = Register

Запуск заданий

эта команда запускает ваши задания, хранящиеся в соединении по умолчанию. В вашем случае Register

php artisan queue:work --queue=high,medium,low,default

эта команда запускает ваши задания, хранящиеся в соединении customConnectionName

php artisan queue:work customConnectionName --queue=high,medium,low,default

Ответ 4

Попробуйте это

'connections' => [

'Register-low' => [
    'driver'        =>  'database',
    'table'         =>  'tbljobs',
    'queue'         =>  'low',
    'retry_after'   =>  5,
],
'Register-high' => [
    'driver'        =>  'database',
    'table'         =>  'tbljobs',
    'queue'         =>  'high',
    'retry_after'   =>  5,
],

'ForgotPassword' => [
    'driver'        =>  'database',
    'table'         =>  'tbljobs',
    'queue'         =>  'low',
    'retry_after'   =>  5,
],

],

И затем

php artisan queue: listen --queue = Register-high, Register-low