MQ全称为Message Queue, 即消息队列。MQ是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求。RabbitMQ则是一个在AMQP基础上完整的,可复用的企业消息系统。
RabbitMQ安装与启动
安装命令
终端中输入以下命令
brew update
brew install rabbitmq
配置RabbitMQ
安装完成后需要将/usr/local/sbin添加到环境变量中
打开.bash_profile文件
vim ~/.bash_profile
将 PATH=/usr/local/sbin:$PATH 加入文件
通过:wq命令保持文件并退出
source ~/.bash_profile
启动RabbitMQ
终端中输入以下命令
rabbitmq-server
登录Web管理界面
浏览器地址栏输入 http://localhost:15672/,账户密码默认 guest
Hello RabbitMQ
通过一个实例来体验RabbitMQ的使用方法。
添加依赖包
在pom.xml文件中新增dependency
com.rabbitmq
amqp-client
3.6.5
Send实现
public class Send {
private final static String QUEUE_NAME = "hello";
public static void main(String[] argv)
throws java.io.IOException {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = null;
Channel channel = null;
try {
connection = factory.newConnection();
channel = connection.createChannel();
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
String message = "Hello Rabbit!";
channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
System.out.println(" [x] Sent '" + message + "'");
} catch (TimeoutException e) {
e.printStackTrace();
} finally {
try {
channel.close();
} catch (TimeoutException e) {
e.printStackTrace();
}
connection.close();
}
}
}
Recv实现
public class Recv {
private final static String QUEUE_NAME = "hello";
public static void main(String[] argv)
throws java.io.IOException,
java.lang.InterruptedException {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = null;
try {
connection = factory.newConnection();
} catch (TimeoutException e) {
e.printStackTrace();
}
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);
}
}
测试结果
多次运行Send类 [x] Sent 'Hello Rabbit!'可以通过界面查看在消息队列中暂存的消息。

此时运行Recv类可以读取消息队列中的消息
[*] Waiting for messages. To exit press CTRL+C
[x] Received 'Hello Rabbit!'
[x] Received 'Hello Rabbit!'
[x] Received 'Hello Rabbit!'