RabbitMQ入门

Posted timesay

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

  在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);
    }

}

  不多说运行看结果。

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

    

 

 

  







以上是关于RabbitMQ入门的主要内容,如果未能解决你的问题,请参考以下文章

RabbitMQ入门:工作队列(Work Queue)

RabbitMQ入门-理论

快速入门分布式消息队列之 RabbitMQ(下)

RabbitMQ系列:Windows下RabbitMQ安装及入门

rabbitmq 极速入门

RabbitMQ入门-发布订阅模式