【问题标题】:How to set high, low and medium priority email using queue?如何使用队列设置高、低和中优先级电子邮件?
【发布时间】:2017-02-19 08:44:22
【问题描述】:

我在学习Job dispatching from here

问题

我读到每个连接都有队列参数,告诉队列名称。问题是:如何设置发送低、中或高优先级电子邮件的优先级?

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);

重置密码的控制器代码

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

【问题讨论】:

  • 您在作业的处理方法中使用了 $User 变量。你确定它已经定义了吗?
  • 是的,我可以确认 User 对象具有价值,并通过在 .env 文件中打印该对象来验证它。
  • 您启动队列工作程序了吗? php artisan queue:work --queue=high
  • 为了完成这项工作...是否有必要在队列连接列表中...我必须有一个名称为 high 的连接?
  • 您的意思是优先级作为 Outlook 中一个漂亮的红色箭头,还是以不同的方式处理队列?

标签: laravel laravel-5.3 laravel-5.4


【解决方案1】:

注意 Connections Vs。 Laravel's queue documentation 中的队列注释,据我所知,它适用于除 SQS 之外的所有队列驱动程序。

在开始使用 Laravel 队列之前,重要的是 了解“连接”和“队列”之间的区别。在你的 config/queue.php 配置文件,有连接 配置选项。这个选项定义了一个特定的连接到 后端服务,例如 Amazon SQS、Beanstalk 或 Redis。然而,任何 给定的队列连接可能有多个可能被认为的“队列” 不同的堆栈或成堆的排队作业。

注意队列中的每个连接配置示例 配置文件包含一个队列属性。这是默认设置 作业被发送到给定的队列时将被分派到的队列 联系。换句话说,如果您在没有明确的情况下派遣工作 定义它应该被分派到哪个队列,作业将是 放置在队列属性中定义的队列中 连接配置:

实际上,您将在您的config/queues.php 文件中注册一个队列连接,如果未提供另一个队列,default 参数将只是默认分配作业的队列。

Vitaly 的上述回答将是解决问题的正确方法(合并到具有默认队列的单个连接),然后根据需要调整您的作业以发送到不同的队列。这是队列配置如何工作的一些重要(我认为)上下文。

【讨论】:

    【解决方案2】:
    '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);
    

    中优先级作业 - 重置密码的控制器代码

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

    低优先级工作

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

    默认优先工作

    dispatch((new DefaultPriorityJob()));
    

    ->onConnection('Register') //如果你指定默认连接是Register in .env QUEUE_DRIVER=Register,这一行很有用

    运行你的工作

    此命令运行存储在默认连接中的作业。在你的情况下注册

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

    此命令运行存储在 customConnectionName 连接中的作业

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

    【讨论】:

    • 默认表示队列名称。这没有设置任何优先级。
    • @Pankaj,, default 表示基于config/queue.php 文件的default 队列...
    【解决方案3】:

    您应该在config/queue.php 文件中定义了两个队列。比如说,一个叫“高”,另一个叫“低”。

    然后,您可以根据需要向他们分派工作,如下所示:

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

    注意:-&gt;onQueue('high')

    最后,您将运行: php artisan queue:work --queue=high,low

    这将启动一个工作器,它将处理“高”队列中的所有作业,然后再处理“低”队列中的作业。

    【讨论】:

    • high :表示队列名称。这没有设置任何优先级。
    • @Helper 是的,这是队列名称,但是您放置队列名称的顺序是从中获取它们的顺序,因此您可以通过它获得优先权
    【解决方案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

    【讨论】:

    • Register-high 是连接名称,high 是队列名称。优先级在哪里?
    【解决方案5】:

    这里解释了队列优先级https://laravel.com/docs/5.7/queues#queue-priorities。 您只需“将逗号分隔的队列名称列表传递给工作命令。”

    正如文档所说:

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

    所以dispatch((new Job)-&gt;onQueue('high')) 的优先级将高于dispatch((new Job)-&gt;onQueue('low'))

    或者您可以使用自定义队列名称:

    php artisan queue:work --queue=first,second.

    【讨论】:

      猜你喜欢
      • 2020-12-21
      • 1970-01-01
      • 2016-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多