最近看了一眼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,对信息进行完善。
今天在这里只介绍一些比较基本的使用,还是那句话——如果不是很懒惰的话,我会把比较高端大气上档次的使用方法继续和大家分享。