前言

讲讲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基本概念与工作模式_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基本概念与工作模式_RabbitMQ的基本概念_02

发布订阅模式需要配置交换机名字,并指定交换机类型为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基本概念与工作模式_RabbitMQ的基本概念_03

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

 

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

例如

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

 

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