Introduction
RabbitMQ是消息代理。主要的想法是很简单的:它接受和转发消息。你可以认为它是一个邮局:当你发送邮件到邮箱你肯定邮差先生最终会发送邮件到你的收件人。用这个来比喻RabbitMQ是一个邮箱,邮局和邮差。
RabbitMQ和邮局之间主要的区别是它不处理纸张,而是接受,存储和转发二进制数据‒消息。
RabbitMQ,和消息在一般情况下,使用一些术语。
>生产 不外乎发送。一个程序,发送消息是一个发送者。我们称之为,“P”:
>队列是一个邮箱的名称。它生活在RabbitMQ。虽然信息流在RabbitMQ和您的应用程序,他们可以只存储在一个队列。队列是不受任何束缚,能储存很多消息只要你喜欢‒它本质上是一个无限的缓冲区。许多生产者可以将消息发送到一个队列,许多消费者可以尝试从一个队列接收数据。一个队列如所这里所画的这样,加上它的名字就是:
>
消费和接收有类似的意义。消费者是一个程序,主要是等待接收消息。在我们的图纸是用“C”:
请注意,生产者,消费者,和中间件没有驻留在同一个机器;事实上在大多数应用中,他们没有。
Hello World!
rabbitMQ是一个在AMQP基础上完整的,可服用的企业消息系统。他遵循Mozilla Public License 开源协议。
关于amqp可参考http://www.oschina.net/p/rabbitmq/
rabbitmq是一个消费的代理;通过生产者客户端生产一个信息,转送给消费者客户端;在这个传输过程中,根据你的需要可以经过路由、缓冲、持久化来得到这个消息。
先通过一个例子开始:通过rabbitmq输出"Hello World!"
其中P代表生产者、C表示消费者、中间红色部分代表消息队列
生产者客户端的发送消息程序如下:
package it.xuhu.jms.rabbit.helloworld;
import java.io.IOException;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
/**
* 发送者
*
* @author xuhu
*
*/
public class Sender {
/**
* 队列名
*/
private final static String QUEUE_NAME = "hello";
public static void main(String[] args) {
Connection connection = null;
Channel channel = null;
try {
// 得到连接工厂
ConnectionFactory factory = new ConnectionFactory();
// 设置主机地址
factory.setHost("localhost");
// 得到连接
connection = factory.newConnection();
// 创建渠道
channel = connection.createChannel();
// 描述队列信息
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
// 发送的消息
String message = "张三,你好";
// 发送消息
channel.basicPublish("", QUEUE_NAME, null,
message.getBytes("utf-8"));
} catch (IOException io) {
io.printStackTrace();
} finally {
try {
if (channel != null)
channel.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (connection != null)
connection.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
消费者客户端接收消息程序如下:
package it.xuhu.jms.rabbit.helloworld;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.QueueingConsumer;
/**
* 接受者
*
* @author xuhu
*
*/
public class Receiver {
/**
* 队列名
*/
private final static String QUEUE_NAME = "hello";
public static void main(String[] args) {
try {
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("等待消息接受......");
// 消费者
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("收到的消息:" + message);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行程序得到的结果如下:
如果消费者出现“张三,你好”说明已接收到此消息信息。