RabbitMQ基本概念与工作模式

强烈推介IDEA2020.2破解激活,IntelliJ IDEA 注册码,2020.2 IDEA 激活码
关注我们,设为星标,每天7:30不见不散,架构路上与您共享 

回复"架构师"获取资源


 

前言

讲讲RabbitMQ的基本概念和工作模式。

提示:以下是本篇文章正文内容,下面案例可供参考

 

一、基本概念

1. AMQP和JMS的区别

JMS是Java消息服务,是Java内部的一种消息中间件。是Java的API规范接口

AMQP是一种协议,直接定义了网络交换的数据格式 ,是一种高级消息队列协议

2.MQ的特性

应用解耦,在系统与系统之间使用中间件增加鲁棒性

异步提速,异步可以做到先提示用户,再消化处理操作,提高系统吞吐量

削峰填谷,将某一瞬间激增的访问量推平,使操作均匀分布

 

二、工作模式

0.初始化生产/消费方

生产者:

  //1.创建连接工厂
  ConnectionFactory factory = new ConnectionFactory();
   //2.设置参数
   factory.setHost("主机地址"); //主机
   factory.setPort(5672);  使用访问端口5672,而不是webui管理界面的端扣15672
   factory.setVirtualHost("/虚拟主机名"); //虚拟主机
   factory.setUsername("WEBUI账号"); //账号密码
   factory.setPassword("WEBUI密码");
   //3.创建连接
   Connection connection = factory.newConnection();
   //4.创建channel
   Channel channel = connection.createChannel();
   //5.创建队列
   //没有hello_world队列就创建一个
   channel.queueDeclare("hello_world",true,false,false,null);
   //6.发送消息
   String body = "hello rabbit";
   channel.basicPublish("","hello_world",null,body.getBytes());
  
   channel.close();
   connection.close();

 

 

消费者:

  //1.创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        //2.设置参数
        factory.setHost("主机地址"); //主机
        factory.setPort(5672); //使用访问端口5672,而不是webui管理界面的端扣15672
        factory.setVirtualHost("/虚拟主机名"); //虚拟主机
        factory.setUsername("WEBUI账号"); //账号密码
        factory.setPassword("WEBUI密码");
        //3.创建连接
        Connection connection = factory.newConnection();
        //4.创建channel (消费者频道)
        Channel channel = connection.createChannel();
        //5.创建队列
        //没有hello_world队列就创建一个
        channel.queueDeclare("hello_world",true,false,false,null);
        //6.接受方法
        Consumer consumer = new DefaultConsumer(channel){
        @Override
        public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
            System.out.println(consumerTag);
            System.out.println(envelope.getExchange());
            System.out.println(envelope.getRoutingKey()); //队列名称
            System.out.println(properties);
            System.out.println(new String(body));
            super.handleDelivery(consumerTag, envelope, properties, body);
        }
    };
    channel.basicConsume("hello_world",true,consumer);
    7. 消费方不要关闭资源

 

 

1.工作队列模式

特点有三:

  1. 一个生产者,一个队列,多个消费者同时竞争消息
  2. 任务量过高时可以提高工作效率
  3. 消费者获得的消息是无序的

 

生产者核心代码

for (int i = 0; i < 10; i++) {
   String body = i+"hello rabbit";
   channel.basicPublish("","work_queue",null,body.getBytes());
}

 

 

消费者方,只需要多配置几个消费者类(线程)即可

 

2.路由模式

需要将队列与交换机绑定,同时指定一个RoutingKey, 队列和消息都需要通过这个RoutingKey匹配,生产方和消费方都需要指定RoutingKey。同时还需指定交换机类型为BuiltinExchangeType.DIRECT

RabbitMQ基本概念与工作模式

 

生产者,需要配置多条队列

  //1.创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        //2.设置参数
        factory.setHost(""); //主机
        factory.setPort(5672); //使用访问端口5672,而不是webui管理界面的端扣15672
        factory.setVirtualHost("/虚拟主机"); //虚拟主机
        factory.setUsername(""); //账号密码
        factory.setPassword("");
        //3.创建连接
        Connection connection = factory.newConnection();
        //4.创建channel
        Channel channel = connection.createChannel();
        //5.创建队列
        String exchangeName = "direct";
        channel.exchangeDeclare(exchangeName, BuiltinExchangeType.DIRECT,true,false,false,null);
        //创建队列
        channel.queueDeclare("routing_queue1",true,false,false,null);
        channel.queueDeclare("routing_queue2",true,false,false,null);
        //绑定队列和交换机
        channel.queueBind("routing_queue1",exchangeName,"error");
        channel.queueBind("routing_queue2",exchangeName,"info");
        String body = "日志信息-info";
        channel.basicPublish(exchangeName,"info",null,body.getBytes());
        channel.basicPublish(exchangeName,"error",null,body.getBytes());

channel.close();
connection.close();

 

 

消费者依据简单队列模式的写法即可

 

3.发布/订阅模式

RabbitMQ基本概念与工作模式

发布订阅模式需要配置交换机名字,并指定交换机类型为FANOUT。创建队列后还要将交换机和队列绑定在一起

生产者核心代码

  String exchangeName = "fanout";
        channel.exchangeDeclare(exchangeName, BuiltinExchangeType.FANOUT,true,false,false,null);
        //创建队列
        channel.queueDeclare("queue1",true,false,false,null);
        channel.queueDeclare("queue2",true,false,false,null);
        //绑定队列和交换机
        channel.queueBind("queue1",exchangeName,"");
        channel.queueBind("queue2",exchangeName,"");

 

 

4.通配模式

 

RabbitMQ基本概念与工作模式

通过通配符以一种更加灵活的方式配置路由,RoutingKey根据配置的不同路由规则选择想要的队列传送数据。

 

在生产端,只需要将channel.queueBind()方法的RoutingKey改为通配符形式,如#.error或order.*等等符合规则的通配符。在channel.basicPublish()发布方法中,指定不同的RoutingKey即可

例如

channel.basicPublish(exchangeName,"goods.error",null,body.getBytes());

 

 

假设此生产者的作用是根据不同的日志系统对不同等级的日志分类处理,goods.error的可以视为将goods系统的error日志存入数据库

————————————————

 

 

文章来源:https://blog.csdn.net/qq_45596525/article/details/116172596

RabbitMQ基本概念与工作模式

到此文章就结束了。如果今天的文章对你在进阶架构师的路上有新的启发和进步,欢迎转发给更多人。欢迎加入架构师社区技术交流群,众多大咖带你进阶架构师,在后台回复“加群”即可入群。




这些年小编给你分享过的干货

1.第七期打卡送书5本(5月1日-6月1日)

2.ERP系统,自带进销存+财务+生产功能,拿来即用

3.带工作流的SpringBoot后台管理项目快速开发解决方案
4.最好的OA系统,拿来即用,非常方便

5.SpringBoot+Vue完整的外卖系统,手机端和后台管理,附源码!

RabbitMQ基本概念与工作模式

转发在看就是最大的支持❤️

本文原创,作者:架构君,其版权均为Java架构师必看所有。如需转载,请注明出处:https://javajgs.com/archives/24966

发表评论