简要概括RabbitMQ工作模式:

1、简单模式 HelloWorld

一个生产者、一个消费者,不需要设置交换机(使用 默认的交换机)

2、工作队列模式 Work Queue

一个生产者、多个消费者(竞争关系),不需要设置交换机(使用默认 的交换机)

3、发布订阅模式 Publish/subscribe

需要设置类型为fanout的交换机,并且交换机和队列进行绑定, 当发送消息到交换机后,交换机会将消息发送到绑定的队列

4、路由模式 Routing

需要设置类型为direct的交换机,交换机和队列进行绑定,并且指定routing key,当发送消息到交换机后,交换机会根据routing key将消息发送到对应的队列

5、通配符模式 Topic

需要设置类型为topic的交换机,交换机和队列进行绑定,并且指定通配符方式的 routing key,当发送消息到交换机后,交换机会根据routing key将消息发送到对应的队列

1、简单模式 HelloWorld

一个生产者

一个消费者Consumer

交换机名称为空,未设置交换机,使用默认交换机

2、工作队列模式 Work Queue

一个生产者

消费者1

消费者2

两个消费者互为竞争关系,争抢消息的接收,“你一条我一条”

3、发布订阅模式 Publish/subscribe

设置交换机,类型为FANOUT,发送消息到多个队列

 /** * 声明交换机 * 参数1: 交换机名称 * 参数2 : 交换机类型fanouttopic directheaders */channel.exchangeDeclare(FANOUT_EXCHANGE, BuiltinExchangeType.FANOUT);

生产者

队列1的消费者

队列2的消费者

交换机绑定队列为并列关系,两个消费者都收到生产者发布的所有消息,不存在竞争关系

4、路由模式 Routing

设置交换机,类型为DIRECT,绑定多个队列并设置RoutingKey

 /** * 声明交换机 * 参数1: 交换机名称 * 参数2 : 交换机类型fanouttopic directheaders */channel.exchangeDeclare(DIRECT_EXCHANGE, BuiltinExchangeType.DIRECT);

生产者发布两种类型RoutingKey的消息

 // 发送信息String message = "新增商品routing模式--" ;/** * 参数1:交换机名称,如果没有指定则使用默认Default Exchage * 参数2:路由key,简单模式可以传递队列名称 * 参数3:消息其它属性 * 参数4:消息内容 */channel.basicPublish(DIRECT_EXCHANGE,"insert", null, message.getBytes());System.out.println("已发送消息:" + message);message = "修改商品routing模式--";channel.basicPublish(DIRECT_EXCHANGE,"update",null,message.getBytes());System.out.println("已发送消息:" + message);

对应的RoutingKey的队列接收交换机发送的对应RoutingKey消息

5、通配符模式 Topic

设置交换机,类型为TOPIC,绑定多个队列并设置RoutingKey,且RoutingKey中带有通配符*、#;*表示可以匹配一个词,#表示可以匹配一个或多个词,例子:item.java、item.java.sout

item.*只能匹配到item.java,item.#可以匹配到item.java和item.java.sout

 // 发送信息String message = "新增商品topic模式--routingkey=insert" ;/** * 参数1:交换机名称,如果没有指定则使用默认Default Exchage * 参数2:路由key,简单模式可以传递队列名称 * 参数3:消息其它属性 * 参数4:消息内容 */channel.basicPublish(TOPIC_EXCHANGE,"item.insert", null, message.getBytes());System.out.println("已发送消息:" + message);message = "修改商品topic模式--routingkey=update";channel.basicPublish(TOPIC_EXCHANGE,"item.update",null,message.getBytes());System.out.println("已发送消息:" + message);message = "删除商品topic模式--routingkey=delete";channel.basicPublish(TOPIC_EXCHANGE,"item.delete.delete",null,message.getBytes());System.out.println("已发送消息:" + message);

RoutingKey设置为item.*的队列的消费者接收到的消息为

RoutingKey设置为item.#的队列的消费者接收到的消息为

总结:

RabbitMQ的五种工作模式区别在于:

问:是否设置交换机?设置的交换机类型是什么?

答:前两种没有设置交换机,后三者设置了交换机,其类型分别为FANOUT,DIRECT,TOPIC,类型不同,实现的功能也不同。

RabbitMQ分析的结果:首先,设置了交换机,模式多样,功能更强;在设置了交换机的基础上,设置交换机的类型不同,实现的功能也不同。如果没有设置交换机,即使用默认交换机,其模式简单,功能有限。