public function actionWithHelloJob(){
$jobHandlerClassName = 'app\duilie\job\Hello';
$jobDataArr = [
'uid' => rand(1,10),
'group_id' => rand(10,99),
] ;
$jobQueueName = "helloJobQueue";
// 4.将该任务推送到消息队列,等待对应的消费者去执行
$isPushed = Queue::push($jobHandlerClassName , $jobDataArr , $jobQueueName );
//$isPushed = Queue::later(10,$jobHandlerClassName , $jobDataArr , $jobQueueName );
// database 驱动时,返回值为 1|false ; redis 驱动时,返回值为 随机字符串|false
if( $isPushed !== false ){
echo date('Y-m-d H:i:s') . " a new Hello Job is Pushed to the MQ"."<br>";
}else{
echo 'Oops, something went wrong.';
}
}这里是消费者 模拟false以后 当这个任务小于三次就重新发送 大于三次后就删除该任务 但是出现了无线循环$isJobStillNeedToBeDone = $this->checkDatabaseToSeeIfJobNeedToBeDone($data);
if(!$isJobStillNeedToBeDone){
$job->delete();
return;
}
$isJobDone = $this->doHelloJob($data);
if ($isJobDone) {
// 如果任务执行成功, 记得删除任务
$job->delete();
print("<info>Hello Job has been done and deleted"."</info>\n");
}else{
if ($job->attempts() > 3) {
$job->delete();
//通过这个方法可以检查这个任务已经重试了几次了
print("<warn>Hello Job has been retried more than 3 times!"."</warn>\n");
// 也可以重新发布这个任务
}else{
print("<info>Hello Job will be availabe again after 2s."."</info>\n");
$job->release(2); //$delay为延迟时间,表示该任务延迟2秒后再执行
}
}private function checkDatabaseToSeeIfJobNeedToBeDone($data){
if ($data['uid'] == 2){
return false;
}
return true;
}
/**
* 根据消息中的数据进行实际的业务处理...
*/
private function doHelloJob($data)
{
$datas = Db::name('admin_auth_group_access')->insert($data);
if ($datas){
return false;
}
return false;
} 最佳答案