首先看一下目录结构
话不多说 上代码
Login控制器文件
class Login extends BaseController
{
public function login()
{
if (request()->isPost()) {
// 接收账号密码
$params = paramsTrim(request()->param());
// 查询用户信息
$user ['userID'] = 1;
// 登录消息队列文件所在
$loginExpress = 'app\job\Login';
// 队列的名称 这个会存储到redis里
$loginQueueName = 'adminLoginQueue';
// 队列参数
$loginQueueParams = ['name' => $params['name'], 'password' => $params['password'],'accessTokenName' => $params['name'].'accessToken'.$user['userID']];
// 即时推送队列 延时推送是later
$pushTask = Queue::push(\app\login\controller\job\Login::class,$loginQueueParams,$loginQueueName);
if ($pushTask !== false) {
echo '已经启动';
} else {
echo 'Oops, something went wrong.';
}
}
}
Login队列文件
<?php
namespace app\login\controller\job;
use think\facade\Cache;
use think\queue\Job;
class Login{
// 发布者
public function fire(Job $job,$data)
{
// 查询 token是否存在 如果已经存在 删除任务
if (cache($data['accessTokenName'])) {
$job->delete();
return;
}
// 执行任务
$consumerLogin = $this->consumerLogin($data);
// 如果执行成功 删除任务
if ($consumerLogin) {
$job->delete();
return;
} else {
// 否则 检查执行次数 如果已经重试3次
if ($job->attempts() > 3){
// 通过这个方法可以检查这个任务已经重试了几次了
// 删除任务 执行失败
print("<warn>Hello Job has been retried more than 3 times!"."</warn>\n");
$job->delete();
return;
}
}
}
// 消费者
public function consumerLogin($data)
{
//这里做一些自定义的操作 例如发送个邮件 短信什么的
if (true) {
return true;
}
return false;
}
}