MQ官方教程地址:http://www.rabbitmq.com/getstarted.html
什么是MQ
MQ
(Message Quene) : 翻译为 消息队列
,通过典型的 生产者
和消费者
模型,生产者不断向消息队列中生产消息,消费者不断的从队列中获取消息。因为消息的生产和消费都是异步的,而且只关心消息的发送和接收,没有业务逻辑的侵入,轻松的实现系统间解耦。别名为 消息中间件
通过利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。基于AMQP协议,erlang语言开发实现的。
AMQP 协议
AMQP(advanced message queuing protocol)`AMQP是一种协议,更准确的说是一种binary wire-level protocol(链接协议)。这是其和JMS的本质差别,AMQP不从API层进行限定,而是直接定义网络交换的数据格式。这使得实现了AMQP的provider天然性就是跨平台的。以下是AMQP协议模型:
简化一下模型:
RabbitMQ支持的消息模型
1. “Hello World!”(直连)
- P:生产者,也就是要发送消息的程序
- C:消费者:消息的接受者,会一直等待消息到来。
- queue:消息队列,图中红色部分。类似一个邮箱,可以缓存消息;生产者向其中投递消息,消费者从其中取出消息。
- 开发生产者
public class Provider {
//生产消息
@Test
public void testSendMessage() throws IOException, TimeoutException {
/* //1.创建链接 mq的链接工厂对象
ConnectionFactory connectionFactory = new ConnectionFactory();
//设置链接mq的主机
connectionFactory.setHost("192.168.10.10");
//设置端口号--tcp通讯的5672
connectionFactory.setPort(5672);
//设置链接哪一个虚拟主机
connectionFactory.setVirtualHost("/ems");
//设置访问虚拟主机的用户名和密码
connectionFactory.setUsername("ems");
connectionFactory.setPassword("lfno11");
//获取链接对象
Connection connection = connectionFactory.newConnection();*/
Connection connection = RabbitMQUtils.gettConnection();
//2.获取链接中的通道
Channel channel = connection.createChannel();
//3.通道绑定对应消息队列
/**
* public com.rabbitmq.client.AMQP.Queue.DeclareOk queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments) throws IOException {
* com.rabbitmq.client.AMQP.Queue.DeclareOk ok = this.delegate.queueDeclare(queue, durable, exclusive, autoDelete, arguments);
* this.recordQueue(ok, queue, durable, exclusive, autoDelete, arguments);
* return ok;
* }
*参数:
* 参数1:queue -队列名称
* 参数2: durable -队列特性是否持久化 ---不持久化重启MQ未消费的队列和消息会消失 true代表持久化(并不能持久化队列中的消息,消息持久化需要在发布的第三个附加消息设置上设置)
* 参数3:exclusive -是否独占队列 true代表独占
* 参数4:autoDelete -消费完成后是否自动删除队列 true自动删除
* 参数5:额外附加参数
*/
channel.queueDeclare("hello1", true, false, false, null);
//4发布消息
/**
* 参数:参数1: 交换机名称 参数2:队列名称 参数3:传递消息额外设置( MessageProperties.PERSISTENT_TEXT_PLAIN设置消息在队列中持久化) 参数4:消息的具体内容
*/
channel.basicPublish("","hello1", MessageProperties.PERSISTENT_TEXT_PLAIN,"Hellow Rabbit".getBytes());
/* channel.close();
connection.close();*/
RabbitMQUtils.closeConnectionAndChanel(channel,connection);
}
}
- 开发消费者
public class Customer {
public static void main(String[] args) throws IOException, TimeoutException {
//创建链接工厂
ConnectionFactory connectionFactory = new ConnectionFactory();
//绑定链接mq的主机,端口,虚拟主机,虚拟主机的登录名和密码
connectionFactory.setHost("192.168.10.10");
connectionFactory.setPort(5672);
connectionFactory.setVirtualHost("/ems");
connectionFactory.setUsername("ems");
connectionFactory.setPassword("lfno11");
//创建一个链接对象
Connection connection = connectionFactory.newConnection()