[一曲广陵不如晨钟暮鼓]
本文开始,我们将介绍RabbitMQ的基本使用方法。在官方文档中,教程分为6个章节,因此,我们也准备使用6个篇幅来介绍其基本使用方法。好了,马上开始正文部分吧!
准备工作:
操作系统:window 7 x64
其他软件:eclipse mars,jdk7,maven 3
--------------------------------------------------------------------------------------------------------------------------------------------------------
1.介绍
RabbitMQ是一个消息代理。其核心思想是:接受并转发消息。你可以将其理解为一个邮局:当你将消息放入到邮箱后,你非常的确定快递员最终将会将这封信送给收件人。用这个模型来作为比喻,RabbitMQ就是一个邮箱,一个邮局,一个快递员的功能的集合。
RabbitMQ与这个集合最大区别是:RabbitMQ不会去处理真正的新建,而是接受,存储,转发二进制的数据----在RabbitMQ的定义中,称之为message。
下面我们来介绍一些在RabbitMQ中常见的术语:
A.Producing:这个概念非常简单,就是发送消息。一个专门用来发送消息的程序,在此称之为producer(生产者)。我们使用下面的图形表示:
B.Queue:这个概念类似邮箱。其依存在RabbitMQ内部。尽管消息是通过RabbitMQ在我们的应用中进行传输,但实际上,message只能被存储在queue中。queue不受任何限制,其可以存储我们想存储的任何消息(本质是一个无限的缓存)。很多producer(生产者)可以通过同一个队列发送消息,很多consumer(消费者)可以通过同一个队列接受消息。一个队列可以通过下面的图形表示:
C.Consumeing:这个概念类似于接受。consumer是一个等待接受消息的程序。我们使用下面的图形表示:
注:在练习环境,生产环境等条件下,producer,consumer,broker不用部署在同一台机器上。实际应用中,也确实如此。
2.Java入门示例。
在本节,我们使用Java来编写两个主程序。一个是producer:简单的发送消息。一个是consumer:接受并打印消息。按照上面的图形表述,我们将模型设置为如下:
1>创建rabbitmq01工程,结构如下:
2.修改pom文件,具体内容如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.csdn.ingo</groupId>
<artifactId>rabbitmq01</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>rabbitmq-1</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>3.4.2</version>
</dependency>
</dependencies>
</project>
3.创建Sender文件,具体内容如下:
package com.csdn.ingo.rabbitmq_1;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
public class Sender {
// 队列名称
private final static String QUEUE_NAME = "hello";
public static void main(String[] argv) throws java.io.IOException {
/**
* 创建连接连接到MabbitMQ
*/
ConnectionFactory factory = new ConnectionFactory();
// 设置MabbitMQ所在主机ip或者主机名
factory.setHost("localhost");
// 创建一个连接
Connection connection = factory.newConnection();
// 创建一个频道
Channel channel = connection.createChannel();
// 指定一个队列
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();
}
}
4.创建Receiver文件,具体内容如下:
package com.csdn.ingo.rabbitmq_1;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.QueueingConsumer;
public class Receiver {
//队列名称
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 = 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");
//创建队列消费者
QueueingConsumer consumer = new QueueingConsumer(channel);
//指定消费队列
channel.basicConsume(QUEUE_NAME, true, consumer);
while (true)
{
//nextDelivery是一个阻塞方法(内部实现其实是阻塞队列的take方法)
QueueingConsumer.Delivery delivery = consumer.nextDelivery();
String message = new String(delivery.getBody());
System.out.println(" [x] Received '" + message + "'");
}
}
}
5.测试办法:先运行Receiver,再运行Sender。示例如下:
注:需要首先启动rabbitmq-server,window条件下是开机启动的,如提示server未启动,可以在安装目录下输入“rabbitmq-server start”启动
--------------------------------------------------------------------------------------------------------------------------------------------------------
至此,系统拆分解耦利器之消息队列---RabbitMQ-Helloworld 结束
参考资料:
官方文档:http://www.rabbitmq.com/tutorials/tutorial-one-java.html