RabbitMQ笔记
1.首先要安装erlang环境。配置环境变量。此电脑,右击,属性。添加一个ERLANG_HOME,然后在Path中添加一个%ERLANG_HOME%\bin
RabbitMq下载完成后,CMD命令行指到对应的文件夹。
分别执行
rabbitmq-service install
rabbitmq-service enable
rabbitmq-service start
在服务中可以看到RabbitMQ服务已经启动
然后查看rabbitmq的状态,rabbitmqctl status. 发现是权限的问题,需要复制cookie
把用户文件夹下的.erlang.cookie文件复制到两个地方,
1.一个是rabbitmq的sbin文件下面,
2.一个是system32/config/systemprofile
然后重启RabbitMQ服务,cmd输入命令rabbitmqctl status.就可以了
安装插件:
rabbitmq-plugins.bat list可以看到可以安装的插件
默认端口是15276
添加账号,默认的账号是guest,密码也是guest。
通过命令行查看用户账号列表; rabbitmqctl list_users
使用命令行添加用户,权限和分组
rabbitmqctl add_user weilian 123456 //添加账号和密码
rabbitmqctl set_permissions weilian ".*" ".*" ".*" // 赋予weilian所有读写的权限
rabbitmqctl set_user_tags weilian administrator //分配用户组。
也可以在页面上添加
推送的时候,队列可以不用绑定交换机Exchange。如下,可以直接推送到helloword的消息队列
channel.QueueDeclare(queue: "helloWord", durable: true, exclusive: false, autoDelete: false, arguments: null); channel.BasicPublish(exchange: "", routingKey: "helloWord", basicProperties: null, body: body);
队列绑定到Exchange的时候
1.声明队列
2.声明交换机Exchange
3.队列和交换机(Exchange)绑定
4.推送消息
ConnectionFactory factory = new ConnectionFactory(); factory.HostName = "localhost"; // RabbitMQ本地运行 factory.UserName = "guest"; // 登录名, factory.Password = "guest"; // 密码 using (IConnection connection = factory.CreateConnection()) { using (IModel channel = connection.CreateModel()) //创建信道 { // 1.声明一个队列 channel.QueueDeclare(queue: "OnlyProductor", durable: true, exclusive: false, autoDelete: false, arguments: null); // 2.声明一个交换机 channel.ExchangeDeclare(exchange: "OnlyProductorExchange", type: ExchangeType.Direct, durable: true, autoDelete: false, arguments: null); // 3.队列Queue和交换机绑定 channel.QueueBind(queue: "OnlyProductor", exchange: "OnlyProductorExchange", routingKey: string.Empty, arguments: null); Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("生产者已经准备就绪"); int i = 0; while (i < 10000) { string message = $"Run消息{i}"; byte[] body = Encoding.UTF8.GetBytes(message); channel.BasicPublish(exchange: "OnlyProductorExchange", // 如果exchange是空,系统采用默认的exchange,推送到队列名称是routingKey这个字段赋值的名称的队列。 routingKey: string.Empty, basicProperties: null, body: body); Console.WriteLine($"Run消息:{message}已经发送"); i++; Thread.Sleep(500); } } }
1.exchange的四种类型
direct;固定匹配key值
fanout: 广播,所有的队列都可以接收到消息
topic:模糊匹配key值。 #可以匹配多个单词,*只能匹配一个单词
header:在http请求头中添加参数进行匹配。和Direct有点像,不过不是根据routingKey,是根据header里面的键值对,性能比较差,完全匹配或者匹配任意一个(根据x-match是any或者all来判断)
channel.exchange_declare(exchange='my-headers-exchange', exchange_type='headers') channel.basic_publish( exchange='my-headers-exchange', routing_key='', body='Hello World!', properties=pika.BasicProperties(headers={'h1': 'Header1'})) 接受消息 channel.queue_bind( queue='HealthQ', exchange='my-headers-exchange', routing_key='', arguments={'x-match': 'any', 'h1': 'Header1', 'h2': 'Header2'})
2.发送消息确认
分为Tx和Confirm模式
3.消费消息确认
autoAck改为false,否则自动确认,失败消费也确认。
下面代码改为try catch,成功的话BasicAck,失败的话BasicReject
4.持久化
设置exchange持久化,队列持久化,消息持久化