开篇,我们要学习RabbitMQ,它是个啥呢?消息队列产品。这消息队列(MQ)能干啥呢??
详细的可以参考这里http://my.oschina.net/piorcn/blog/340421。
里面有一点写的很好:
消息代理实现了发布者和订阅者在时间、空间和流程三个方面的解耦:
时间解耦—-发布方和订阅方无需同时在线就能够进行消息传输,消息中间件通过存储转发提供了这种异步传输的能力;
空间解耦——发布方和订阅方都无需知道对方的物理地址、端口,甚至无需知道对方的逻辑名字和个数;
流程解耦——发布方和订阅方在发送和接收数据时并不阻塞各自的控制流程。
好吧。很强大是不?那我们来看看这东西怎么用。
首先RabbitMQ是个服务,我们要先把它安装上,并运行起来。
GG大法。找到RabbitMQ的官网下载新版。http://www.rabbitmq.com/download.html
我的虚机是ubuntu的,直接下个deb包就是了。下载完双击打开,install。
装哪去了呢?/usr/sbin下有几个rabbitmq开头的命令:
rabbitmq的老家在/usr/lib/rabbitmq,bin下几个常用的指令和配置的链接,内容都在lib下。
好。让我们把rabbitmq服务启来。执行
rabbitmq-server
这里的broker,你可以理解为就是一个MQ的服务了。用netstat 指令看一下端口。rabbitmq默认的端口是5672,现在已经是在监听状态了。
呃。这就完了?
有个很有用的东西:web管理界面。我们得知道这服务现在在干啥吧。怎么启动呢?。管理界面是个插件,用以下的指令打开。
rabbitmq-plugins enable rabbitmq_management
进入localhost:15672,用户名guest:guest。
ok,一会我们会用到。
服务启来了,怎么试一下呢?先来说几个概念。
MQ是用来通信消息的,也就是说这消息要有人投递到MQ中,有人从MQ中的消费掉消息。投递的角色叫Producter,消费的角色叫Consumer。
那消息到了MQ放哪儿呢?有一个类似信箱的概念叫QUEUE,就是一个存放消息的地方。
我们要分别创建一个Producter和一个Consumer来测试一下。
很开心。rabbitMQ有提供javaclient,来与MQ通信。在前面的下载页面有。
先从Producter开始,三步,建连接,绑定队列,发送数据。
建连接:
ConnectionFactory factory = new ConnectionFactory(); factory.setHost("10.88.102.167"); factory.setUsername("root"); factory.setPassword("123123"); Connection connection = factory.newConnection(); Channel channel = connection.createChannel();
绑定队列:
channel.queueDeclare(QUEUE_NAME, true, false, false, null);
发送数据,数据为字节数组,灵活性很高:
channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
嗯。来个完整的例子,发送者,不停向队列放入数据。
public class HelloSender {private final static String QUEUE_NAME = "hello";public static void main(String[] args) throws IOException, InterruptedException { ConnectionFactory factory = new ConnectionFactory(); factory.setHost("10.88.102.167"); factory.setUsername("root"); factory.setPassword("123123"); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); channel.queueDeclare(QUEUE_NAME, true, false, false, null); int i = 1; while (true) { String message = "Hello World!" + i++; channel.basicPublish("", QUEUE_NAME, null, message.getBytes()); System.out.println(" [x] Sent '" + message + "'"); Thread.sleep(100); } } }
那Consumer呢?三步,建连接,绑定队列,接收数据。
建连接:同Producter
绑定队列:
QueueingConsumer consumer = new QueueingConsumer(channel); channel.basicConsume(QUEUE_NAME, true, consumer);
接收数据:
QueueingConsumer.Delivery delivery = consumer.nextDelivery();byte[] msg = delivery.getBody();
完整的例子:
public class HelloConsumer {private final static String QUEUE_NAME = "hello";public static void main(String avg[]) throws IOException, java.lang.InterruptedException { ConnectionFactory factory = new ConnectionFactory(); factory.setHost("10.88.102.220"); factory.setUsername("root"); factory.setPassword("123123"); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); System.out.println(" [*] Waiting for messages. To exit press CTRL+C"); QueueingConsumer consumer = new QueueingConsumer(channel); channel.queueDeclare(QUEUE_NAME, true, false, false, null); channel.basicConsume(QUEUE_NAME, true, consumer); while (true) { QueueingConsumer.Delivery delivery = consumer.nextDelivery(); byte[] msg = delivery.getBody(); String message = new String(msg); System.out.println(" [x] Received '" + message + "'"); } } }
进入web界面,点QUEUE。是不是有个hello?还能看到消息的负载。
一切顺利不是么?