think-queues+Redis

think-queues+Redis队列消息

1、安装 thinkphp-queue

composer install topthink/think-queue

2、确保Redis安装好
3、配置消息队列的驱动

return [
	'default'   => '',
	'connector' => 'Redis',

	// 服务器地址
	'host' => '127.0.0.1',
	'password' =>'123456',
	'prot' =>'123456',
	'timeount'=>0,
	'persistent'=>'false',

];

4、消息的创建与推送
我们在业务控制器中创建一个新的消息,并推送到 DemoToQueue队列
新增 \application\index\controller\Queues.php 控制器,在该控制器中添加 index 方法

<?php
namespace app\api\controller;
use think\Controller;
use think\facade\Request;
use think\Queue;

class Queues extends Controller
{
	//队列方法测试
	public function index(){
		$jobhandlerClassName = "app\api\job\Demo";
		$jobqueuesName = "DemoToQueue";

		$jobData=['ts'=>time()];

		$isPushed = Queue::push($jobhandlerClassName,$jobData,$jobqueuesName);
		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.';
		}
    }
}

5、消息的消费与删除
编写 Demo消费者类,用于处理 DemoToQueue队列中的任务
新增 \application\index\job\Demo.php 消费者类,并编写其 fire() 方法

<?php
namespace app\api\Job;
use think\Controller;
use think\queue\Job;
class Demo 
	{
	/**
	* fire方法是消息队列默认调用的方法
	* @param Job            $job      当前的任务对象
	* @param array|mixed    $data     发布任务时自定义的数据
	*/
	public function fire(Job $job,$data)
	{
		// 有些消息在到达消费者时,可能已经不再需要执行了
		$isDo = $this->checkDatabaseDone($data);
		if(!$isDo){
			$job->delete();
			return;
		}
		//
		$isJob = $this->doJob($data);
		if ($isJob) {
		// 如果任务执行成功, 记得删除任务
			$job->delete();
			print("<info>删除成功"."</info>\n");
		}else{
			if ($job->attempts() > 3) {
				//通过这个方法可以检查这个任务已经重试了几次了
				print("<warn>Hello Job has been retried more than 3 times!"."</warn>\n");
				$job->delete();
				// 也可以重新发布这个任务
				//print("<info>Hello Job will be availabe again after 2s."."</info>\n");
				//$job->release(2); //$delay为延迟时间,表示该任务延迟2秒后再执行
			}
		}
	}  
	/**
	* 有些消息在到达消费者时,可能已经不再需要执行了
	* @param array|mixed    $data     发布任务时自定义的数据
	* @return boolean                 任务执行的结果
	*/
	private function checkDatabaseDone($data){
		return true;
	}
	/**
	* 根据消息中的数据进行实际的业务处理...
	*/
	private function doJob($data) 
	{
		print("<info>Hello Job Started. job Data is: ".var_export($data,true)."</info> \n");
		print("<info>Hello Job is Fired at " . date('Y-m-d H:i:s') ."</info> \n");
		print("<info>哈哈删掉啦!"."</info> \n");
		return true;
	}
}

至此,所有的代码都已准备完毕。
6、我们在浏览器种访问Queues/index,可以看到消息推送成功。

http://192.168.1.166:8080/Queues

7、处理任务,切换当前终端窗口的目录到项目根目录下,执行

php think queue:work --queue DemoToQueue

8、可以看到执行的结果类似如下:

<info>Hello Job Started. job Data is: array (
  'ts' => 1627266350,
)</info>
<info>Hello Job is Fired at 2021-07-26 10:26:22</info>
<info>哈哈删掉啦!</info>
<info>删除成功</info>
Processed: app\api\job\Demo

至此,我们成功地经历了一个消息的 创建 -> 推送 -> 消费 -> 删除 的基本流程。

该文章参考来源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值