RabbitMQ在Windows上的使用
1.下载安装Erlang
RabbitMQ是基于AMQP协议进行通讯的,其中Erlang语言完成了对AMQP的封装,所以我们需要下载安装Erlang,下载完成之后会得到一个类似otp_win64_20.0.exe的文件,本次演示使用的版本是20.0的,演示版本的安装包也可以从底部的源码里面获取。
2.下载安装RabbitMQ
到RabbitMQ官网下载RabbitMQ的安装文件,会得到一个类似rabbitmq-server-3.7.5.exe的文件(同上,底部的源码会给出安装文件)。安装过程没有太多需要解释的,直接下一步。安装完成之后,RabbitMQ会作为一个Windows的服务启动。
如果没有启动,记得先将它启动起来。
3.启用RabbitMQ界面
首先打开一个命令行窗口,然后进入RabbitMQ安装路径下的sbin文件夹,譬如我的是:
D:\software\RabbitMQ\rabbitmq_server-3.7.5\sbin
可以运行这个命令查看插件列表:rabbitmq-plugins list
观察红色框框出的这个插件,是否是开启状态,也就是前面是否有“E*”的标志,开启了管理插件,我们才可以使用RabbitMQ提供的后台管理界面。
如果没有开启,使用命令开启管理插件:rabbitmq-plugins enable rabbitmq_management
接着,在浏览器访问:http://localhost:15672,就会进入RabbitMQ的后台管理界面:
默认的用户名和密码都是guest,点击登录:
在这里我们就可以看到概览、连接、通道、交换器、队列等等的相关信息。
4.编写消息生产者和消息消费者
内容来源是RabbitMQ的开发文档:http://www.rabbitmq.com/getstarted.html
首先创建一个简单java的maven项目hello-rabbitmq,来当做RabbitMQ客户端的消息生产者,在pom.xml中加入依赖:
<dependencies> <dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client</artifactId> <version>4.6.0</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.25</version> </dependency> </dependencies>
创建com.init.springCloud包,之后在包下创建SendMessage.class类,按照开发文档编写消息生产者并发布一个信息,我的注释也写得比较完整,就不过多解释了:
package com.init.springCloud; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; public class SendMessage { //声明一个队列的名称 private final static String QUEUE_NAME = "hello"; public static void main(String[] args) throws Exception{ ConnectionFactory factory = new ConnectionFactory(); //1.设置主机,其实默认用的就是本机,端口5672,不用设置 factory.setHost("localhost"); //2.创建连接 Connection connection = factory.newConnection(); //3.创建通道 Channel channel = connection.createChannel(); //4.将消息放到队列里 //2、3、4、5参数的意思:是否是持久的;是否是独立的;是否自动删除;队列参数 //这里都用默认的就可以了 channel.queueDeclare(QUEUE_NAME, false, false, false, null); String message = "Hello World!"; //5.发布消息到RabbitMQ服务器 channel.basicPublish("", QUEUE_NAME, null, message.getBytes()); System.out.println(" [x] Sent '" + message + "'"); //6.发送完毕之后,关闭连接 if(channel != null){ channel.close(); } if(connection != null){ connection.close(); } } }
运行main()方法,控制台打印了推送信息,我们去RabbitMQ的管理界面也可以看到新增了一个消息队列,有一条消息存在于队列中:
接下来编写消息消费者,创建ReceiveMessage.class类,用于接收消息:
package com.init.springCloud; import java.io.IOException; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; import com.rabbitmq.client.Consumer; import com.rabbitmq.client.DefaultConsumer; import com.rabbitmq.client.Envelope; import com.rabbitmq.client.AMQP.BasicProperties; public class ReceiveMessage { private final static String QUEUE_NAME = "hello"; public static void main(String[] args) throws Exception{ ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); 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, 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); } }
前面的步骤都大致类似,这里说一下接收消息的DefaultConsumer(),里面实现了一个handleDelivery的方法:由于我们可能会在生产者之前启动消费者,所以在尝试使用它之前,我们希望确保队列的存在。Consumer会异步地推送我们的消息,所以我们提供了一个回调,它的形式是一个对象,它将缓冲这些消息,直到我们准备好使用它们为止。
运行ReceiveMessage的mian()方法,可以看到控制台输出了我们之前发布的消息: