zoukankan      html  css  js  c++  java
  • RabbitMQ入门

    一、简述

      a) RabbitMQ是mq的一种,目前全球来讲社区是最活跃的,有问题一查就有。以前写过腾讯的CMQ,社区文档真的少啊。

      b) RabbitMQ用处一般为啦异步处理,并且可实现一个业务同步处理,速度、效率明显提高。如注册,那么你想给客户发短信与邮件,那么只需要把这两个消息放入MQ中就可。

       还可以实现项目间的解耦通讯等。

      c) 配上在网上扒的原理图:

      

      d) 分类

        我感觉可以给其分为两大类,通过有没有路由的维度分Queue(队列)与Exchange(路由)。一般开发场景都用Exchange。

        Queue可一对一,可一对多,消息均摊。

        Exchange有几种分别为:fanout,direct,topic,headers。

    类型名称 类型描述
    fanout 广播路由,把所有发送到该Exchange的消息路由到所有与它绑定的Queue中
    direct Routing Key==Binding Key
    topic 模糊路由通过规则匹配
    headers Exchange不依赖于routing key与binding key的匹配规则来路由消息,而是根据发送的消息内容中的headers属性进行匹配。

    二、安装RabbitMQ(windows)

      a) 安装Erlang

          首先,您需要安装支持的 Windows 版Erlang。下载并运行Erlang for Windows 安装程序。下载地址http://www.erlang.org/downloads

           

      b) RabbitMQ的下载安装

       下载地址http://www.rabbitmq.com/install-windows.html

         

      c) erl环境变量配置    ERLANG_HOME=d:javasofterl7.1

      

       Path中加入%ERLANG_HOME%in;

      

      测试erl配置是否正确,开始-运行-cmd,输入erl,显示如下,证明配置正确

      

      d) RabbitMQ环境变量配置   都一样先配置环境变量再加入Path中

       RABBITMQ_SERVER=C:Program FilesRabbitMQ Server abbitmq_server-3.7.3

      

      在Path中加入%RABBITMQ_SERVER%sbin;

      

      e) 激活rabbitmq_management

      在sbin目录下输入   rabbitmq-plugins enable rabbitmq_management

      或在CMD中键入如下命令 :  

      "C:Program FilesRabbitMQ Server
    abbitmq_server-3.7.3sbin
    abbitmq-plugins.bat" enable rabbitmq_management
      

      f) 启动RebbitMQ

      启动命令: net start RabbitMQ
      停止命令: net stop RabbitMQ
      g) RabbitMQ测试
      测试地址 http://localhost:15672/
      默认的用户名:guest
      默认的密码为:guest

     

    三、编写例子(springboot) 例子来自于官网  https://www.rabbitmq.com/tutorials/tutorial-one-java.html

      在pom文件中加入maven依赖

      <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency>

      a) 发送端(生产者)

    import java.io.IOException;
    import java.util.concurrent.TimeoutException;
    import org.junit.Test;
    import com.rabbitmq.client.Channel;
    import com.rabbitmq.client.Connection;
    import com.rabbitmq.client.ConnectionFactory;
    
    public class SendMQ {
        private final static String QUEUE_NAME = "Hello";
    
        public static void main(String[] args) throws IOException, Exception {
            // connection是socket连接的抽象,并且为我们管理协议版本协商(protocol version negotiation),
            // 认证(authentication )等等事情。这里我们要连接的消息代理在本地,因此我们将host设为“localhost”。
            // 如果我们想连接其他机器上的代理,只需要将这里改为特定的主机名或IP地址。
            ConnectionFactory factory = new ConnectionFactory();
            factory.setHost("localhost");
            factory.setPort(5672); //默认端口号
            factory.setUsername("guest");//默认用户名
            factory.setPassword("guest");//默认密码
            Connection connection = factory.newConnection();
            Channel channel = connection.createChannel();
            // 接下来,我们创建一个channel,绝大部分API方法需要通过调用它来完成。
            // 发送之前,我们必须声明消息要发往哪个队列,然后我们可以向队列发一条消息:
            channel.queueDeclare(QUEUE_NAME, false, false, false, null);
            String message = "Hello world";
            channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
            System.out.println(" [x] Sent '" + message + "'");
            channel.close();
            connection.close();
        }
    }

      b) 接受端(消费者)

    import com.rabbitmq.client.ConnectionFactory;
    import com.rabbitmq.client.Connection;
    import java.io.IOException;
    import org.junit.Test;
    import com.rabbitmq.client.AMQP;
    import com.rabbitmq.client.Channel;
    import com.rabbitmq.client.Consumer;
    import com.rabbitmq.client.DefaultConsumer;
    import com.rabbitmq.client.Envelope;
    
    public class RecvMQ {
        private final static String QUEUE_NAME = "Hello";
    
        public static void main(String[] args) throws IOException, Exception {
            ConnectionFactory factory = new ConnectionFactory();
            factory.setHost("localhost");
            factory.setPort(5672);
            factory.setUsername("guest");
            factory.setPassword("guest");
            Connection connection = factory.newConnection();
            Channel channel = connection.createChannel();
            channel.queueDeclare(QUEUE_NAME, false, false, false, null);
            System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
            Consumer consumer = new DefaultConsumer(channel) {
                @Override
                public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,
                        byte[] body) throws IOException {
                    String message = new String(body, "UTF-8");
                    System.out.println(" [x] Received '" + message + "'");
                }
            };
            channel.basicConsume(QUEUE_NAME, true, consumer);
        }
    
    }

      不多说运行看结果。

       感谢网上的奉献者,在这里致谢。

        

      

  • 相关阅读:
    01 Vue的起步和插值表达式
    06 扩展的对象的功能
    05 解构赋值
    04 函数之扩展运算符、箭头函数
    03 函数之默认值、剩余参数
    02 模板字符串
    01 let和const命令
    28 Bootstrap排版
    27 Bootstrap的列偏移
    26 Bootstrap的栅格系统
  • 原文地址:https://www.cnblogs.com/TimeSay/p/10375952.html
Copyright © 2011-2022 走看看