一、简述
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); } }
不多说运行看结果。
感谢网上的奉献者,在这里致谢。