* @version : HUOSDK-IDENTITY 1.0 */ namespace huoIdentify\lib\queue\job; use huoIdentify\lib\queue\constant\JobConst; use huoIdentify\model\IdentifyInQueueModel; use huolib\queue\job\Fire; use think\queue\Job; class IdentifyFire extends Fire { /** * fire方法是消息队列默认调用的方法 * * @param Job $job 当前的任务对象 * @param array|mixed $data 发布任务时自定义的数据 */ public function fire(Job $job, $data) { $_is_job_done = $this->doJob($data); if ($_is_job_done) { /* 如果任务执行成功, 记得删除任务 */ $job->delete(); } else { $_limit_attempts = get_val($data, 'attempts', JobConst::JOB_ATTEMPTS_MAX_CNT); $_attempts = $job->attempts(); if ($_attempts >= $_limit_attempts) { /* 任务达到最大次数则删除任务不再执行 */ $job->delete(); $this->deleteData($data); } else { /* 重新发布任务 */ switch ($_attempts) { case 1: $_delay = JobConst::JOB_ATTEMPTS_SECOND_TIME; break; case 2: $_delay = JobConst::JOB_ATTEMPTS_THIRD_TIME; break; case 3: $_delay = JobConst::JOB_ATTEMPTS_FOURTH_TIME; break; case 4: $_delay = JobConst::JOB_ATTEMPTS_FIFTH_TIME; break; default: $_delay = JobConst::JOB_ATTEMPTS_ONCE_TIME; } $job->release($_delay); /* $_delay为延迟时间,表示该任务延迟$_delay秒后再执行 */ } } } /** * 根据消息中的数据进行实际的业务处理 * * @param array $data 发布任务时自定义的数据 * * @return bool 任务执行的结果 */ public function doJob($data) { $_iiq_id = isset($data['iiq_id']) ? $data['iiq_id'] : ''; if (empty($_iiq_id)) { /* $_iiq_id 为空认为执行成功,否则会重复入队列 */ return true; } $_identify_class = isset($data['identify_class']) ? $data['identify_class'] : ''; if (class_exists($_identify_class)) { return (new $_identify_class())->checkFromQueue($_iiq_id); } return true; } /** * 删除数据库数据 * * @param $data */ public function deleteData($data) { $_iiq_id = isset($data['iiq_id']) ? $data['iiq_id'] : ''; if (!empty($_iiq_id)) { (new IdentifyInQueueModel())->deleteData($_iiq_id); } } }