RabbitMq入门随笔

1.RabbitMq数据流动过程
生产者生产消息->交换机->队列->消费者消费
一个交换机可以多个队列,消费者监听队列对消息进行消费

在Linux上安装RabbitMq,首先需要安装erlang,因为RabbitMq是运行在erlang环境上,还需要安装依赖包(socat依赖包)

2.安装命令 rpm -ivh +relang包
再安装socat包 rpm -ivh +socat包
最后安装 RabbitMq rpm -ivh +mq安装包
利用vim 命令在lib/rebbitmq_server/ebin/rabbit.app里修改loopback_user 放开(默认是注释的) 默认user是guest(管控台登录名)

3.启动和停止
启动:rabbitmq-server start & 停止:rabbitmqctl stop_app 
lsof -i :5672 查看rabbitmq进行信息
rabbitmq-plugins list 查看所有插件
rabbitmq-plugins enable rabbitmq_management  //启动管控台插件 管控台端口号:15672 消息端口号:5672

4.默认虚拟主机是/可以自己新加

5.消息的生产和消费
ConnectionFactory 获取连接的工厂
Connection 一个客户端和server的连接
Channel 数据通信信道,可以发送和接收消息
Queue 具体的消息存储队列
QueuingConsumer 消息队列的消费者
Delivery mq 对消息和channel的java封装

6.交换机详解
exchange 接收消息,并根据路由键转发消息所绑定的队列。
交换机的属性:
 name 交换机的名字
 type 交换机的类型direct,topic,fanout,headers(不常用)
 durability 是否需要出九华,true为持久化
 auto_delete 当最后一个绑定到exchange上的队列删除后,自动删除该exchange
 internal 当前exchange是否用于rabbitMQ内部使用,默认是false
 arguments 可扩展参数,用户自自定义的交换机时,用到的参数

7.生产者生产数据java代码
//1.创建出链接工厂
ConnectionFactory factory =new ConnectionFactory();
factory.setHost("192.168.158.128");
factory.setPort(5672);
factory.setVirtuaHost("/");
//2.通过链接创建出链接对象
Connection conection =factory.newConnection();
//3.通过链接对象创建channel
Channel channel =connection.createChannel();
//4.通过channel发布消息
/**
*第一个参数表示交换机的名称
*第二个参数是路由键
*第三个参数是消息的额外属性
*第四个参数表示消息的内容 
*/
String msg="hello";
channel.basicPublish("","test",null,msg.getBytes());
//5.释放资源
channel.close();
connection.close();

8.消费者消费代码
//1.创建出链接工厂
ConnectionFactory factory =new ConnectionFactory();
factory.setHost("192.168.158.128");
factory.setPort(5672);
factory.setVirtuaHost("/");
//2.通过链接创建出链接对象
Connection conection =factory.newConnection();
//3.通过链接对象创建channel
Channel channel =connection.createChannel();
//4.创建出消息队列
/**
*第一个参数表示消息队列的名称
*第二个参数是消息是否持久化
*第三个参数channel独占消息队列
*第四个参数表示是否自动删除队列,当消息队列没有绑定交换机时是否自动删除
*第五个参数表是消息队列的扩展参数
*/
channel.ueueDeclare("test",true,false,false,null);
//5.创建出消费者
QueueingConsumer consumer =new QueueingConsumer(channel);
//6.通过channel把消费者和消息队列进行关联
String queueName ="test";
/**
*第一个参数是队列名字,对应生产者端的队列名
*第二个参数是代表是否自动签收(也就是说消费端收到消息是否告诉服务器一声)
*第三个参数代表哪个消费者
*/
channel.basicConsume(queueName,true,consumer);  
//7.获取消息,对消息进行处理
QueueingConsumer.Delivery delivery =consumber.nextDelivery();
String msg =new String(delivery.getBody());

注意:上边代码发送消息的时候并没有指定哪个交换机,这时候RabbitMq会给我们指定默认的交换机
且默认的交换机会根据routingKey的名字把消息投递到和routingKey名字相同的队列中,这也是为什么消费端的队列名字为test

9.交换机类型
1.direct routingKey路由到和routingKey值相同的队列中
2.tocpic 队列可以有通配符 #是多个 * 是一个 一个交换机可以对应多个队列 例如:交换机:hello.yys 那么假如两个队列名为 #.yys 和hello.*,
那么交换机hello.yys可以路由到这两个队列
3.不用routigKey 哪些队列绑定交换机,就路由到那些队列(速度最快)

10.声明交换机
void ExchangeDeclare(string exchange, string type, bool durable, bool autoDelete, IDictionary<string, object> arguments);
参数:

  1.1:exchange:交换机的名称

  1.2:Type:交换机的类型(direct,fanout,topic)

  1.3:durable:如果为true的话,服务器重启后该Exchange保留。(尽设置此项,不能保证重启后消息还在)

  1.4:autoDelete:如果为true的话,当没有消费者的时候,Exchange自动删除。

  1.5:argments:交换机的属性参数

11.绑定交换机
channe.queueBind(queueName,exchangeName,routingKey); 这种是生产者指定交换机名字的场景 要把交换机和队列绑定

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值