【问题标题】:Laravel - Queue jobs are not reused?Laravel - 队列作业不被重用?
【发布时间】:2019-02-15 12:25:24
【问题描述】:

我知道,这个问题很奇怪……

场景: 我有一个发送电子邮件的 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('source@domain.com', 'Email Source')
            ->from('source@domain.com', 'Email Source')
            ->to('target@domain.com', 'Email Target')
            ->subject($this->subject)
            ->setBody($template->markup, 'text/html');
    });

}

我的控制器

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

【问题讨论】:

  • 您是否尝试重新启动队列?或者将队列驱动程序设置为同步?只是为了测试目的?通常这不应该发生。
  • 感谢您的反馈。这真的很奇怪......如果我直接使用 \Mail 类以及 later() 来执行此操作,它可以正常工作。唯一的细节是,如果我使用\Mail::later(),它不会让它成为原始电子邮件,但它可以正常工作,即队列“出现”是可以的......因为我可以推迟发送电子邮件。并回答您的问题:是的,队列是 QUEUE_CONNECTION=database。
  • 你确定可以有一个空数组作为 mail::send 的第一个参数吗?我通常使用可邮寄的,所以没有尝试过你的方法。它在队列外工作吗?
  • 或者你可以试试 mail::raw('subject', function(){}); ?
  • 是的,这是真的。每次编辑作业类时都需要重新启动队列,因为它正在被缓存。这就是为什么我之前问过您是否尝试重新启动队列。我也建议使用 laravel Horizo​​n。

标签: laravel laravel-queue laravel-jobs


【解决方案1】:

因为队列工作者是长期存在的进程,如果不重新启动,它们将无法识别代码更改。在部署期间优雅地重新启动工作人员...运行。

php artisan queue:restart

查看更多:https://laravel.com/docs/5.7/queues#queue-workers-and-deployment

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-20
    • 2014-12-08
    • 2020-01-01
    • 1970-01-01
    • 2017-01-08
    • 2018-07-15
    • 2014-11-19
    • 2019-05-29
    相关资源
    最近更新 更多