Consumor
Ⅱ、操作流程及API 【一】创建连接工厂ConnectionFactory ConnectionFactory factory = new ConnectionFactory(); 我们可以为actory设置各种参数来进行连接初始化
factory.setUsername("guest");//设置服务器登录账号 factory.setPassword("guest");//设置服务器登录密码 factory.setHost("127.0.0.1");//设置服务器IP factory.setPort("15427");//设置服务器端口 factory.setVirtualHost("http://www.likecs.com/");//设置虚拟主机 【二】创建连接Connection Connection connection = factory.newConnection(); 【三】创建信道Channel Channel channel = connection.createChannel();知识点:
连接和信道的关系:连接是客户端与服务器开启的TCP连接,由于TCP连接的开启和销毁都需要消耗大量的性能,所以我们在连接的基础上使用了信道的概念,对连接进行逻辑再分,每个连接都可以创建多个信道,这些信道共用一个连接。
信道就是RabbitMQ中最实用的组件了,几乎所有针对交换器、队列、生产者、消费者的操作全部都在这里面执行。
【四】创建交换器Exchange Exchange.DeclareOK exchangeDeclare( String exchange, // 声明交换器名称 String type, // 声明交换器类型 boolean durable, // 声明是否持久化 boolean autoDelete, // 声明是否自动删除 boolean internal, // 声明是否内置 Map<String, Object> arguments // 创建交换器的其他参数 ) throws IOException Exchange.DeclareOK exchangeDeclare( String exchange, // 声明交换器名称 BuiltinExchangeType type, // 声明交换器类型 boolean durable, // 声明是否持久化 boolean autoDelete, // 声明是否自动删除 boolean internal, // 声明是否内置 Map<String, Object> arguments // 创建交换器的其他参数 ) throws IOException 创建交换器的方法有上面两种,这两种的区别仅在于声明交换器的类型type参数的类型不同,第一种常用。其实上面的方法每个都有很多个重载的方法,采用一些默认的参数。这里只列举参数最全的方法,来介绍其各个参数的意义。
知识点:交换器类型
RabbitMQ的交换器拥有四种类型,分别为fanout、direct、topic、headers。fanout类型的交换器会将消息路由到所有与其绑定的队列中,类似于广播;direct类型是默认的交换器类型,它只会将消息路由到指定的队列中,这个队列的绑定key必须与消息的路由key完全一致;topic类型的交换器是最常使用的交换器类型,是一种模糊匹配的交换器,它会将消息路由到所有绑定key与消息路由key可匹配的队列上;至于headers类型的交换器并不常用,因为其性能较差,并不实用。
这里BuiltinExchangeType类型是一个枚举,它里面定义了这四种 类型的枚举值:FANOUT、DIRECT、TOPIC、HEADERS。
知识点:交换器持久化
开启交换器的持久化,那么交换器在创建好之后会持久化到磁盘,一般对于生产环境中长期使用的交换器,最好开启持久化功能,用以提升RabbitMQ的可用性(高可用要点之一),服务器异常宕机的情况下可以硬件恢复。
知识点:交换器自动删除
交换器在不再使用的情况下是可以自动删除的,只要在创建交换器的时候设置autoDelete属性为true即可开启自动删除功能,默认为false。
自动删除功能必须要在交换器曾经绑定过队列或者交换器的情况下,处于不再使用的时候才会自动删除,如果是刚刚创建的尚未绑定队列或者交换器的交换器或者早已创建只是未进行队列或者交换器绑定的交换器是不会自动删除的。
不再使用的交换器指的即使那些曾经绑定过队列或者交换器,现在已经没有任何绑定队列或者交换器的情况下的交换器。
知识点:内置交换器
内置交换器是一种特殊的交换器,这种交换器不能直接接收生产者发送的消息,只能作为类似于队列的方式绑定到另一个交换器,来接收这个交换器中路由的消息,内置交换器同样可以绑定队列和路由消息,只是其接收消息的来源与普通交换器不同。
交换器的创建可以在代码中实现,也可以不再代码中实现。推荐在代码中实现,因为当要创建的交换器已存在于RabbitMQ服务器中时,是不会再次创建的,而是直接返回创建成功。
【五】绑定交换器exchangeBind Exchange.bindOK exchangeBind( String destination, // 指定目标交换器 String source, // 指定源交换器 String routingKey, // 指定绑定Key Map<String, Object> arguments // 其他一些结构化参数 ) throws IOException知识点:交换器绑定
交换器一般用来被队列绑定,但其实它也可以被另一个交换器绑定,绑定其实就是将二者关联起来,绑定两个交换器,就是将两个交换器关联起来,这里面有一个主动方,一个被动方,主动方是要执行绑定的交换器(目标交换器),被动方是被绑定的交换器(源交换器),绑定的过程其实就是将目标交换器的绑定key送给源交换器,这时其实可以将目标交换器看成是一个队列,将自己绑定到源交换器上,依靠的也是绑定key,不过这里的绑定key是没明确的路由Key,而非topic类似的模糊key。源交换器会将目标交换器当做一个队列进行看待,将接收到的路由key与目标交换器绑定key完全匹配消息路由到这个目标交换器中。