[一曲广陵不如晨钟暮鼓]
本文开始,我们将介绍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 + "'"); } } }
注:需要首先启动rabbitmq-server,window条件下是开机启动的,如提示server未启动,可以在安装目录下输入“rabbitmq-server start”启动
--------------------------------------------------------------------------------------------------------------------------------------------------------
至此,系统拆分解耦利器之消息队列---RabbitMQ-Helloworld 结束
参考资料:
官方文档:http://www.rabbitmq.com/tutorials/tutorial-one-java.html