1.确保redis服务没问题 .env中修改队列驱动
QUEUE_CONNECTION=redis
2.创建控制器及路由
php artisan make:controller TestJobController
Route::group([
'prefix' => 'test',
], function () {
//测试队列
Route::get('/test-job', [\App\Http\Controllers\TestJobController::class, 'testJob']);
});
3.创建队列及队列中业务逻辑代码
php artisan make:job SendMessageJob
<?php
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Log;
class SendMessageJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public $tries = 3;
public $timeout = 60;
protected $message = null;
protected $sender = null;
protected $receiver = null;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct($message = '', $sender = null, $receiver = null)
{
$this->message = $message;
$this->sender = $sender;
$this->receiver = $receiver;
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
// 业务逻辑代码
try {
$content = "发送人:" . $this->sender . "接收人:" . $this->receiver . "消息主体:" . $this->message;
Log::info($content);
} catch (\Exception $exception) {
Log::info('发送消息队列异常:'. $exception->getMessage());
}
}
}
4.发起请求及控制器中调用队列
<?php
namespace App\Http\Controllers;
use App\Jobs\SendMessageJob;
use Illuminate\Http\Request;
class TestJobController extends Controller
{
public function testJob(Request $request)
{
SendMessageJob::dispatch($request->input('message'), $request->input('sender'), $request->input('receiver'));
}
}
发起请求后查看redis
5.执行队列
php artisan queue:work
查看日志
队列执行成功
6.延时队列
//延迟队列(3分钟)
SendMessageJob::dispatch($request->input('message'), $request->input('sender'), $request->input('receiver'))->delay(Carbon::now()->addMinutes(3));