---
## 1. laravel 任务队列订单超时支付或者报名超时支付
![图片alt](/media/editor/1623219940049_20210603145651159773.png ''图片title'')
### 1. 创建一个队列任务文件
php artisan make:job OrderUnpaidTimeEndJob
### 2. 选择队列存储的方式 (两种方式)
QUEUE_CONNECTION=database
QUEUE_CONNECTION=redis
### 3. 创建数据表并启动队列
> ps: 因为这里选择的是database就只能先创建两个数据表
php artisan queue:failed-table //失败的队列
php artisan queue:table //进行中的任务队列
php artisan migrate
php artisan queue:work //启动队列
php artisan queue --help //查看帮助
### 4. 监听我们的队列并生成日志文件 `AppServiceProvider.php`
public function boot()
{
Queue::before(function (JobProcessing $event) {
$message = '';
$queueData = [
'action' => $event->job->resolveName(),
'context' => [
'queue_id' => $event->job->getJobId(),
'data' => [
'connection' => $event->connectionName,
'body' => $event->job->payload(),
]
],
];
switch ($queueData['action']) {
case "App\\Jobs\\OrderUnpaidTimeEndJob":
$message = 'StudentSemester_before';
}
\Log::error($message, $queueData);
});
Queue::after( function (JobProcessed $event) {
$message = '';
$queueData = [
'action' => $event->job->resolveName(),
'context' => [
'queue_id' => $event->job->getJobId(),
'data' => [
'connection' => $event->connectionName,
'body' => $event->job->payload(),
]
],
];
switch ($queueData['action']) {
case "App\\Jobs\\OrderUnpaidTimeEndJob":
$message = 'StudentSemester_after';
}
\Log::error($message, $queueData);
});
}
### 5. 如何在代码中进行启动
dispatch(new OrderUnpaidTimeEndJob();
> 构造函数编写如下
private $create_time;
public function __construct()
{
// $this->delay($this->create_time->addSeconds(10)); //测试秒超时时间
$this->delay($this->create_time->addMinutes($delayTime)); //真实超时时间
}
> 在延迟时间过后会出现执行下面的句柄
public function handle()
{
$studentSemesterStatus = (new UserService())->systemCancel($this->id);
if(!$studentSemesterStatus){
//发送取消保密性信息 MSG TODO
$this->job->delete();
//延迟发送
}
}
> 失败后记录日志
public function failed($exception = null)
{
\Log::error('studentSemesterService: ' . $exception->getMessage()); //记录日志
//失败后的操作 TODO
}
### 6. 测试的方法
> #### 在 phpunit 中我们需要修改如下代码下面的是同步方法, 异步就填写为 database
<server name="QUEUE_CONNECTION" value="sync"/>
> #### 配置文件生效不点击可能生效不了
![图片alt](/media/editor/1624248117818_20210616122058745383.png ''图片title'')
### 7. 如何重试失败的队列, 使用 Laravel 的门面方法
Artisan::call('queue:retry', ['id' => [$id]]);
### 8. 配合 node.js 的任务管理器 ecosystem.config.js
module.exports = {
apps: [{
name: 'queue order',
script: 'artisan',
'cwd': '/apps',
args: 'queue:work',
instances: 1,
autorestart: true,
watch: false,
max_memory_restart: '1G',
interpreter: 'php',
env: {
NODE_ENV: 'development'
},
env_production: {
NODE_ENV: 'production'
}
}],
};