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
二 引用
三 初始化
在这里面我们需要解释几个字段:
username:定义一个MQ的名称,对应一个中间件;
virtualhost:访问路径,限定可访问的交换机、队列、绑定关系等。
这些参数都有相应的默认值。
当然,我们也可以使用URIs的形式:
无论哪种方法,都有其默认值。
之后,就可以初始化channel了。
channel是核心。负责收发信息,以及为之后的切面所服务。
调用完成之后,就需要关闭连接了。
note:(歪果仁的文档一般写的都很详细,这点是国内所谓的高手不具备的能力!!!无法将idea进行share,是互联网时代闭门造車的典范。)使用完进行关闭不是必须的,只是一种好的习惯。当调用优先级高的连接,就会将闲置的自动关闭掉。
四 交换机和队列的使用
这一部分是AMQP的高级部分。使用前我们需要进行声明,如果没有所需的,可以使用自定义的。
上面的例子应该是老版本的声明。
对于交换机的构建,主要有以下几个函数。
像上边代码构建的就是一个“direct”类型的持久型非自动删除的交换机。以及一个非持久的特有的自动删除的队列。上边的方法称作——通过给定的路由关键字,将队列绑定到交换机。
当然,上面只是一个最基本的例子,只有一个队列,且其他的MQ不会引用;那么,我们可以通过下面的方式解决上面的问题。
我们可以通过红框标记的方法,进行声明。例子中我们声明了一个持久型、非典型的可自动删除的队列。
五 消息的发送
消息的发送是通过basicPublish进行发布的。
当然,按照惯例,下面的方式是比较好的。
那么我们就举一个例子好了:
我们可以通过自建的MessageProperies,对信息进行完善。
今天在这里只介绍一些比较基本的使用,还是那句话——如果不是很懒惰的话,我会把比较高端大气上档次的使用方法继续和大家分享。
本文基于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,对信息进行完善。
今天在这里只介绍一些比较基本的使用,还是那句话——如果不是很懒惰的话,我会把比较高端大气上档次的使用方法继续和大家分享。
相关文章推荐
- 《将博客搬至CSDN》
- HDU2602 01背包 xingxing在努力
- ssh localhost
- 随机抽样一致性算法(RANSAC)
- 为什么要用消息系统
- iPhone屏幕尺寸、分辨率及适配
- java实现发送手机短信
- 微软SQLHelper.cs类 中文版
- phpmyadmin上传较大sql文件
- spring AOP自定义注解方式实现日志管理
- 第一个博客
- android ARGB 转 RGB
- HTML5与微信开发(2)-视频播放事件及API属性
- STM32小积累(1)
- [IIS] 不能加载类型System.ServiceModel.Activation.HttpModule
- 序列化对象到文件
- haproxy + rabbitmq + keepalived的高可用环境搭建
- Node.js开发者必须熟悉的四个JavaScript概念
- WebService SOAP、Restful和HTTP(post/get)请求区别
- mpls代码位置