laravel+rabbitMQ
laravel+rabbitMQ
前言
第一次学习消息队列rabbit,因为平时使用的是laravel,因此我打算把laravel和rabbit结合起来
提示:以下是本篇文章正文内容,下面案例可供参考
一、安装Erlang环境
1.安装erlang前安装下依赖文件
yum install gcc glibc-devel make ncurses-devel openssl-devel xmlto
2.去erlang官网下载erlang安装包
wget -c http://erlang.org/download/otp_src_22.3.tar.gz
3.解压
tar -zxvf otp_src_22.3.tar.gz
cd otp_src_22.3/
4.编译安装
./configure --prefix=/usr/local/erlang
make && make install
5.配置环境变量
vim /etc/profile
末尾加入一行:export PATH=$PATH:/usr/local/erlang/bin
source /etc/profile
二、安装rabbitmq
1.下载
*wget -c https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.8/rabbitmq-server-generic-unix-3.8.8.tar.xz
2.解压
xz -d rabbitmq-server-generic-unix-3.8.8.tar.xz
tar -xvf rabbitmq-server-generic-unix-3.8.8.tar*
3.操作
cd rabbitmq_server-3.8.8/sbin
启动:rabbitmq-server
关闭:rabbitmqctl stop
查看状态:rabbitmqctl status
启用插件: rabbitmq-plugins enable rabbitmq_management
访问管理页面:http://localhost:15672 端口默认为15672
4.添加用户
rabbitmqctl add_user admin admin //添加用户,后面两个参数分别是用户名和密码
rabbitmqctl set_permissions -p / admin “." ".” “.*” //添加权限
rabbitmqctl set_user_tags admin administrator //修改用户角色,将用户设为管理员
二、laravel安装rabbitmq
1.Composer 安装
composer require vladimir-yuldashev/laravel-queue-rabbitmq
安装的时候可能会报版本不符合错误
这时候只要安装对应laravel的laravel-queue-rabbitmq版本即可
2.config/app.php ,providers 中添加:
VladimirYuldashev\LaravelQueueRabbitMQ\LaravelQueueRabbitMQServiceProvider::class,
3.app/config/queue.php 配置中connections 数组中加入下列配置
'rabbitmq' => [
'driver' => 'rabbitmq',
'connection' => PhpAmqpLib\Connection\AMQPLazyConnection::class,
'dsn' => env('RABBITMQ_DSN', null),
'factory_class' => Enqueue\AmqpLib\AmqpConnectionFactory::class,
'host' => env('RABBITMQ_HOST', '127.0.0.1'),
'port' => env('RABBITMQ_PORT', 5672),
'vhost' => env('RABBITMQ_VHOST', '/'),
'login' => env('RABBITMQ_LOGIN', 'guest'),
'password' => env('RABBITMQ_PASSWORD', 'guest'),
'queue' => env('RABBITMQ_QUEUE', 'default'),
'options' => [
'exchange' => [
'name' => env('RABBITMQ_EXCHANGE_NAME'),
'declare' => env('RABBITMQ_EXCHANGE_DECLARE', true),
'type' => env('RABBITMQ_EXCHANGE_TYPE', \Interop\Amqp\AmqpTopic::TYPE_DIRECT),
'passive' => env('RABBITMQ_EXCHANGE_PASSIVE', false),
'durable' => env('RABBITMQ_EXCHANGE_DURABLE', true),
'auto_delete' => env('RABBITMQ_EXCHANGE_AUTODELETE', false),
'arguments' => env('RABBITMQ_EXCHANGE_ARGUMENTS'),
],
'queue' => [
'name' => 'queuename',
'declare' => env('RABBITMQ_QUEUE_DECLARE', true),
'bind' => env('RABBITMQ_QUEUE_DECLARE_BIND', true),
'passive' => env('RABBITMQ_QUEUE_PASSIVE', false),
'durable' => env('RABBITMQ_QUEUE_DURABLE', true),
'exclusive' => env('RABBITMQ_QUEUE_EXCLUSIVE', false),
'auto_delete' => env('RABBITMQ_QUEUE_AUTODELETE', false),
'arguments' => env('RABBITMQ_QUEUE_ARGUMENTS'),
],
],
'sleep_on_error' => env('RABBITMQ_ERROR_SLEEP', false),
'ssl_params' => [
'ssl_on' => env('RABBITMQ_SSL', false),
'cafile' => env('RABBITMQ_SSL_CAFILE', null),
'local_cert' => env('RABBITMQ_SSL_LOCALCERT', null),
'local_key' => env('RABBITMQ_SSL_LOCALKEY', null),
'verify_peer' => env('RABBITMQ_SSL_VERIFY_PEER', true),
'passphrase' => env('RABBITMQ_SSL_PASSPHRASE', null),
],
],
这些配置githup有详细介绍
4.修改 .env 文件
QUEUE_DRIVER=rabbitmq
#以下是新增配置
RABBITMQ_HOST=192.168.111.174
RABBITMQ_PORT=5672 #mq的端口
RABBITMQ_VHOST=/
RABBITMQ_LOGIN=admin #mq的登录名
RABBITMQ_PASSWORD=admin #mq的密码
RABBITMQ_QUEUE=queuename #mq的队列名称
5.封装rabbitMQ类(测试用)
<?php
namespace App\Module\Queue;
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
class RabbitMQ
{
//创建静态私有的变量保存该类对象
// static private $connectionInstance;
//防止使用new直接创建对象
private function __construct(){
}
//防止使用clone克隆对象
private function __clone(){
}
// public static function getConnectionInstance(){
// if (empty(self::$connectionInstance)) {
// $config = config('queue.connections.rabbitmq');
// self::$connectionInstance = new AMQPStreamConnection($config['host'], $config['port'], $config['login'], $config['password'], $config['vhost']);
// }
// return self::$connectionInstance;
// }
private static function getConnect(){
$config = config('queue.connections.rabbitmq');
return new AMQPStreamConnection($config['host'], $config['port'], $config['login'], $config['password'], $config['vhost']);
}
public static function push($queue, $messageBody, $exchange = 'router'){
$connection = self::getConnect();
$channel = $connection->channel();
$channel->queue_declare($queue, false, true, false, false);
$channel->exchange_declare($exchange, 'direct', false, true, false);
$channel->queue_bind($queue, $exchange); // 队列和交换器绑定
$message = new AMQPMessage($messageBody, array('content_type' => 'text/plain', 'delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT));
$channel->basic_publish($message, $exchange); // 推送消息
$channel->close();
$connection->close();
}
public static function pop($queue, $callback, $exchange = 'router'){
$connection = self::getConnect();
$channel = $connection->channel();
$message = $channel->basic_get($queue); //取出消息
$res = $callback($message->body);
if($res){
$channel->basic_ack($message->getDeliveryTag());
}
$channel->close();
$connection->close();
}
}
6.laravel创建任务类
php artisan make:job TestQueue
在终端内执行上述命令,会自动生成 app/Jobs/TestQueue.php 文件
这里附上测试代码
<?php
namespace App\Jobs;
use App\Module\Queue\RabbitMQ;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
class TestQueue implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct($array = [])
{
RabbitMQ::push('test_queue', $array['msg']);
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
RabbitMQ::pop('test_queue', function ($message){
print_r($message);
return true;
});
}
public function failed(\Exception $exception)
{
// 给用户发送任务失败的通知,等等……
}
}
6.将队列运行起来
php artisan queue:work
7.把数据放进 mq 队列
这里我新建了一个控制器来调用
TestQueue::dispatch(['msg' => 'testMsg']); //这里把msg传到TestQueue的__construct
下面我们来测试一下
当执行到了TestQueue::dispatch([‘msg’ => ‘testMsg’]);这里之后
终端显示
总结
最近刚学了rabbitMQ想把它结合laravel用起来,rabbitMQ还有很多需要学习的地方。以上有不足或者问题之处请各位指出。
作者:qq_34972339
来源链接:https://blog.csdn.net/qq_34972339/article/details/108579836
版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。
2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。