您的位置:首页 > 其它

RabbitMQ 教程一

2015-11-26 12:01 204 查看
最近看了一眼MQ,由于网上很多文章多是些皮毛以及特别虚的空中楼阁,抽出点时间,稍作了点整理,跟大家分享一下(主要是怕被自己帅痴呆了)。

本文基于Rabbit MQ 3.5.6正式版本,其他版本可能会有一些出入,请参阅官方文档。

Rabbit MQ和其他的MQ的横向以及纵向比较,在这里就不做了,大家可以看看相关贴子,既然在这里选择Rabbit MQ,可定是有其无可替代的优势。嘛,话不多说,单刀赴会。

一 常用类和接口

一般常用的类和接口有一下4个:

Channel1 协议规则的载体

Connection1 用于开启channel
2 注册生命周期 3 关闭MQ

ConnectionFactory1
初始化并实例化connection

Consumer

二 引用

import com.rabbitmq.client.Connection;
import com.rabbitmq.client.Channel;


三 初始化

ConnectionFactory factory = new ConnectionFactory();
factory.setUsername(userName);
factory.setPassword(password);
factory.setVirtualHost(virtualHost);
factory.setHost(hostName);
factory.setPort(portNumber);
Connection conn = factory.newConnection();

在这里面我们需要解释几个字段:

username:定义一个MQ的名称,对应一个中间件;

virtualhost:访问路径,限定可访问的交换机、队列、绑定关系等。

这些参数都有相应的默认值。

当然,我们也可以使用URIs的形式:

ConnectionFactory factory = new ConnectionFactory();
factory.setUri("amqp://userName:password@hostName:portNumber/virtualHost");
Connection conn = factory.newConnection();

无论哪种方法,都有其默认值。

之后,就可以初始化channel了。

Channel channel = conn.createChannel();

channel是核心。负责收发信息,以及为之后的切面所服务。

调用完成之后,就需要关闭连接了。

channel.close();
conn.close();


note:(歪果仁的文档一般写的都很详细,这点是国内所谓的高手不具备的能力!!!无法将idea进行share,是互联网时代闭门造車的典范。)使用完进行关闭不是必须的,只是一种好的习惯。当调用优先级高的连接,就会将闲置的自动关闭掉。

四 交换机和队列的使用

这一部分是AMQP的高级部分。使用前我们需要进行声明,如果没有所需的,可以使用自定义的。

channel.exchangeDeclare(exchangeName, "direct", true);
String queueName = channel.queueDeclare().getQueue();
channel.queueBind(queueName, exchangeName, routingKey);

上面的例子应该是老版本的声明。

对于交换机的构建,主要有以下几个函数。



像上边代码构建的就是一个“direct”类型的持久型非自动删除的交换机。以及一个非持久的特有的自动删除的队列。上边的方法称作——通过给定的路由关键字,将队列绑定到交换机。



当然,上面只是一个最基本的例子,只有一个队列,且其他的MQ不会引用;那么,我们可以通过下面的方式解决上面的问题。

channel.exchangeDeclare(exchangeName, "direct", true);
channel.queueDeclare(queueName, true, false, false, null);
channel.queueBind(queueName, exchangeName, routingKey);

我们可以通过红框标记的方法,进行声明。例子中我们声明了一个持久型、非典型的可自动删除的队列。



五 消息的发送

byte[] messageBodyBytes = "Hello, world!".getBytes();
channel.basicPublish(exchangeName, routingKey, null, messageBodyBytes);

消息的发送是通过basicPublish进行发布的。



当然,按照惯例,下面的方式是比较好的。

channel.basicPublish(exchangeName, routingKey, mandatory,
MessageProperties.PERSISTENT_TEXT_PLAIN,
messageBodyBytes);


那么我们就举一个例子好了:

channel.basicPublish(exchangeName, routingKey,
new AMQP.BasicProperties.Builder()
.contentType("text/plain").deliveryMode(2)
.priority(1).userId("bob")
.build()),
messageBodyBytes);

我们可以通过自建的MessageProperies,对信息进行完善。

今天在这里只介绍一些比较基本的使用,还是那句话——如果不是很懒惰的话,我会把比较高端大气上档次的使用方法继续和大家分享。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: