将 RabbitMQ 的消费任务放入 Laravel 的 queue 中,然后通过 artisan command 执行消费任务。在队列任务中添加检查队列是否为空的逻辑,并在队列为空时退出循环,然后在队列处理完毕后执行 stop。以下是示例代码:
// 示例 RabbitMQ 消费代码
$channel = $connection->channel();
$channel->queue_declare('task_queue', false, true, false, false);
$callback = function ($msg) {
// 处理消息
// 加入 Laravel 队列
dispatch(new ProcessMessageJob($msg->body));
$msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']);
};
$channel->basic_consume('task_queue', '', false, false, false, false, $callback);
while (count($channel->callbacks)) {
$channel->wait();
}
// 示例 Laravel 队列任务代码
public function handle()
{
while ($msg = RabbitMQ::pop()) {
// 处理消息
}
// 队列为空就退出循环
exit();
}
// 示例 artisan command 代码
public function handle()
{
while (true) {
// 检查队列是否为空
if (RabbitMQ::isEmpty()) {
break;
}
// 执行队列任务
Artisan::call('queue:work', ['--queue' => 'default']);
// 等待片刻,避免占用过多资源
sleep(1);
}
// 队列处理完毕后停止服务
Artisan::call('down');
}