Laravel - задания в очереди не используются повторно?

Я знаю, вопрос очень странный ...

Сценарий: у меня есть класс Job, который отправляет электронное письмо, но содержимое этого электронного письма изменено, поскольку шаблон электронного письма выбирается перед отправкой.

Я не знаю, правда ли это, но, по-видимому, Laravel поддерживает кеш контента, который он запустил впервые. Даже изменив значение свойств, Job отправляет точно такое же электронное письмо.

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

\ app \ Jobs \ SenderEmail001.php

/**
 * Create a new job instance.
 *
 * @return void
 */
public function __construct($template_id, $subject)
{
    $this->template_id = $template_id;

    $this->subject     = $subject;
}

/**
 * Execute the job.
 *
 * @return void
 */
public function handle()
{
    $template = Template::findOrFail($this->template_id);

    \Mail::send([], [], function($message) use ($template)
    {
        $message
            ->replyTo('[email protected]', 'Email Source')
            ->from('[email protected]', 'Email Source')
            ->to('[email protected]', 'Email Target')
            ->subject($this->subject)
            ->setBody($template->markup, 'text/html');
    });

}

MyController

\App\Jobs\SenderEmail001::dispatch(6, 'subject subject subject')
    ->delay(now()->addSecond(100))
    ->onQueue('default');

person Magno Alberto    schedule 15.02.2019    source источник
comment
Вы пытались перезапустить очередь? Или настроить драйвер очереди на синхронизацию? Просто для тестирования? Обычно этого не должно происходить.   -  person Nick Surmanidze    schedule 15.02.2019
comment
Спасибо за ответ. Это действительно странно ... Если я сделаю это напрямую с помощью класса \ Mail вместе с Later (), он будет работать правильно. Единственная деталь заключается в том, что если я использую \ Mail :: later (), он не позволяет ему быть необработанным электронным письмом, но он работает нормально, то есть очередь появляется в порядке ... поскольку я могу отложить отправку Эл. адрес. И отвечая на ваш вопрос: да, очередь QUEUE_CONNECTION = database.   -  person Magno Alberto    schedule 15.02.2019
comment
Вы уверены, что можете использовать пустой массив в качестве первого аргумента mail :: send? Я обычно использую почтовые отправления, поэтому не пробовал ваш подход. Работает вне очереди?   -  person Nick Surmanidze    schedule 15.02.2019
comment
Или, может быть, вы могли бы попробовать mail :: raw ('subject', function () {}); ?   -  person Nick Surmanidze    schedule 15.02.2019
comment
Я не знаю, есть ли в этом какой-то смысл, но, видимо, если я внесу какие-то изменения в класс Job, мне нужно будет остановить очередь ремесленников: работать и снова запустить. Из того, что я мог наблюдать, поскольку очередь: работа продолжает работать супервизором постоянно, изменения в моем классе работы, похоже, вступают в силу только после повторного запуска очереди ремесленников: работа.   -  person Magno Alberto    schedule 15.02.2019
comment
Да, это правда. Вам необходимо перезапускать очередь каждый раз, когда вы редактируете класс задания, потому что он кэшируется. Вот почему я раньше спрашивал, пытались ли вы перезапустить очередь. Я бы также рекомендовал использовать горизонт laravel.   -  person Nick Surmanidze    schedule 15.02.2019


Ответы (1)


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

php artisan queue:restart

см. больше: https://laravel.com/docs/5.7/queues#queue-workers-and-deployment

person Lawrence Njenga    schedule 01.03.2019