本系列文章翻译自www.rabbitmq.com/tutorials/tutorial-one-java.html,为了方便以后学习,特意翻译了下来!通过本系列文章将会让你对RabbitMQ有个简单料及并且
会简单使用它!
这些教程包括创建使用RabbitMQ的消息应用程序的基础知识。您需要安装要RabbitMQ服务器 - 在此我们将单独写篇文章介绍RabbitMQ服务器在Ubuntu下的安装以及ERlang环境的安装。
当然,装完服务器之后,才能进行我们接下来的操作~~
RabbitMQ是一个消息代理。本质上,它从生产者那里接受消息,并把消息分发发给消费者。在两者之间,它可以根据你设定的规则路由,缓冲,持久化消息。
<1>生产方式无非就是发送消息,我们将发送消息的程序成为“生产者”即producer,我们用“P”来表示:
<2>队列是一个“邮箱”的名字,它在RabbitMQ里面。虽然消息通过RabbitMQ和应用程序,它可以存储在消息队列里面,队列是不受任何约束的,可以根据需求存储尽可能多的消息,它本质上是一个无限的缓冲区。许多生产者可以发送一个消息队列,许多消费者可以从这个队列中接收数据。如下图所示:
<3>“消费者”意思也就是“消息接收者”,一个消费者程序就是为了等待接收消息的,我们用“C”来表示:
需要注意的是,消费者、生产者和代理服务(也就是RabbitMQ服务器)是没必要非得在同一台机器上的,他们可以是不同服务器之间进行通讯。
大多数公司也是这么做的。RabbitMQ主要用于不同项目之间的消息传递。
接下来,我们来用java(当然也可以用python、ruby、php、c#)实现一个“Hello World”的例子:
在本节中,我们将用Java编写两个程序;生产者发送一个消息,消费者接收信息,并打印出来。我们先不对相关的类进行介绍。我们用一个“Hello World”消息传递的李子给大家一个简单的了解。
"P"是生产者,”C“是消费者。中间的是消息队列,用来缓存生产者发送的消息。
Java客户端库
提到RabbitMQ就不得不说到AMQP,这是一个开放的,通用的协议进行消息传递。AMQP有许多不同语言的客户端。我们将使用RabbitMQ的所提供的Java客户端。
下载相关的架包,检查所描述的签名。将它解压缩到您的工作目录,并解压缩JAR文件到工作目录中:
$ unzip rabbitmq-java-client-bin-*.zip
$ cp rabbitmq-java-client-bin-*/*.jar ./
(该RabbitMQ的Java客户端也可以在中央Maven仓库找到并下载。)
现在我们建立好了项目所需要的架包和依赖,我们可以开始写代码了:
Sending:
我们用Send.java来发送消息,用Recv.java来接受消息。发送者通过链接RubbitMQ服务器,并发送一个简单的消,然后退出。
Send.java需要导入的类包:
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.Channel;
定义队列的名字:
public class Send {
private final static String QUEUE_NAME = "hello";
public static void main(String[] argv)
throws java.io.IOException {
...
}
}
然后,我们跟RabbitMQ服务器创建一个链接:
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
这个链接是一个抽象的socket链接,并为我们提供协议的协商和认证。接下来,连接到RabbitMQ服务器上,因为我们将服务器装到了本地,所以用“localhost”,如果你装到了别的机器上,这里可以填写指定的IP或者名称。
接下来,我们创建一个”channel“这是传递或者获取消息所必需的一个类。
为了发送消息,必须声明一个队列,那么我们就可以发布一条消息队列了:
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();
发送不起作用!
如果这是您第一次使用RabbitMQ,你看不到的“Sent”的字样,那么你可能会留抓耳挠腮想知道是什么错误。
也许是代理刚开始没有足够的可用磁盘空间(默认情况下,它需要至少1GB可用),因此拒绝接受消息。检查日志文件确认,必须减少限制。
该 配置文件 <a target=_blank target="_blank" href="http://www.rabbitmq.com/configure.html#config-items">http://www.rabbitmq.com/configure.html#config-items</a>会告诉你如何设置disk_free_limit。
Receiving:
接下来,我们介绍一下发送者,我们从RabbitMQ接受一条推送的消息,接收者和发送者之间有一点不同的是,接收者要不断的去监听消息,并将消息打印出来。
Recv.java所依赖的包:
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.QueueingConsumer;
另外,QueueingConsumer是我们用来缓存被推送到RabbitMQ服务器上的类'
和发送者相同,我们需要打开一个链接和管道,并声明一个将要cusume的队列,注意:声明的队列名一定要和发送者的队列名保持一致。
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 = 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作的事情。
QueueingConsumer consumer = new QueueingConsumer(channel);
channel.basicConsume(QUEUE_NAME, true, consumer);
while (true) {
QueueingConsumer.Delivery delivery = consumer.nextDelivery();
String message = new String(delivery.getBody());
System.out.println(" [x] Received '" + message + "'");
}
QueueingConsumer.nextDelivery()的意思就是等待下一条从服务器出来的消息。
Here's the whole Recv.java class.
接下来,你就可以编译他了:
$ javac -cp rabbitmq-client.jar Send.java Recv.java
运行的时候,需要rabbitmq-client.jar,在终端上运行Send.java:
$ java -cp .:commons-io-1.2.jar:commons-cli-1.1.jar:rabbitmq-client.jar Send
然后,运行Recv.java
$ java -cp .:commons-io-1.2.jar:commons-cli-1.1.jar:rabbitmq-client.jar Recv
接收者将会打印从发送者发送到RabbitMQ的消息。接收者将会一直运行着,等待接下来消息(用Ctl-C终止运行)
所以你可以多次运行发送者试一试,看看看会有什么结果!!
如果你想查看所有的队列,你可以运行以下命令:
$rabbitmqctl list_queues
好了,Hello World!到此为止,接下来进入第二篇的学习吧,建立一个工作队列~~~