如何使用队列设置高,低和中优先级电子邮件?

Pan*_*kaj 16 laravel laravel-5.3 laravel-5.4

我正在从这里学习工作调度

问题

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

Cmd提示

我正在使用命令:php artisan queue:监听进程作业.

我尝试了什么?

php artisan queue:work --queue=high,default
Run Code Online (Sandbox Code Playgroud)

但是如果连接的队列参数值不高,则此代码永远不会起作用

默认队列驱动程序

'default' => env('QUEUE_DRIVER', 'database'),
Run Code Online (Sandbox Code Playgroud)

队列连接

'connections' => [

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

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

],
Run Code Online (Sandbox Code Playgroud)

.ENV

QUEUE_DRIVER=Register
Run Code Online (Sandbox Code Playgroud)

注册电子邮件的控制器代码

$job = (new SendActivationEmail($Data))
        ->onConnection('Register');
dispatch($job);
Run Code Online (Sandbox Code Playgroud)

重置密码的控制器代码

$job = (new SendResetPasswordEmail($this->tokens->create($user), $user))
        ->onConnection('ForgotPassword');
dispatch($job);
Run Code Online (Sandbox Code Playgroud)

Dwi*_*ght 10

记下Connections Vs. 队列记录在Laravel的队列文档中,据我所知,它适用于除SQS之外的所有队列驱动程序.

在开始使用Laravel队列之前,了解"连接"和"队列"之间的区别非常重要.在config/queue.php配置文件中,有一个连接配置选项.此选项定义与后端服务(如Amazon SQS,Beanstalk或Redis)的特定连接.但是,任何给定的队列连接都可能有多个"队列",可能被认为是不同的堆栈或成堆的排队作业.

请注意,队列配置文件中的每个连接配置示例都包含一个队列属性.这是将作业发送到给定连接时将调度作业的默认队列.换句话说,如果您在未明确定义应分派到哪个队列的情况下调度作业,则作业将被放置在连接配置的队列属性中定义的队列中:

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

上面的维塔利的答案是解决问题的正确方法(合并到一个默认队列的单一连接)然后根据需要调整你的工作以发送到不同的队列.对于队列配置的工作原理,这是一些重要的(我认为)上下文.


avi*_*vip 6

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

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

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

笔记: ->onQueue('high')

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

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

  • @Helper是的,它是队列名称,但是您放置队列名称的顺序就是从中获取它们的顺序,因此您可以通过该顺序获得优先级 (2认同)

小智 5

'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,
    ],
],
Run Code Online (Sandbox Code Playgroud)

我建议您通过以下方式修改代码:

'connections' => [
    'Register' => [
        'driver'        =>  'database',
        'table'         =>  'tbljobs',
        'queue'         =>  'default',
        'retry_after'   =>  5,
    ],
],
Run Code Online (Sandbox Code Playgroud)

高优先级作业-注册电子邮件的控制器代码

$job = (new SendActivationEmail($Data))
        ->onConnection('Register')
        ->onQueue("high");
dispatch($job);
Run Code Online (Sandbox Code Playgroud)

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

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

低优先级工作

dispatch((new LowPriorityJob())->onQueue("low"));
Run Code Online (Sandbox Code Playgroud)

默认优先作业

dispatch((new DefaultPriorityJob()));
Run Code Online (Sandbox Code Playgroud)

-> onConnection('Register')//如果指定默认连接为.env中的Register,则此行很有用QUEUE_DRIVER = Register

运行你的工作

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

php artisan queue:work --queue=high,medium,low,default
Run Code Online (Sandbox Code Playgroud)

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

php artisan queue:work customConnectionName --queue=high,medium,low,default
Run Code Online (Sandbox Code Playgroud)