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()方法,可以看到控制台输出了我们之前发布的消息:
最后,大家有什么不懂的或者其他需要交流的内容,也可以进入我的QQ讨论群一起讨论:654331206
Spring Cloud系列:
Spring Cloud服务管理框架Eureka简单示例(三)