RabbitMQ常用的三种ExchangeTypes:fanout、direct、topic。fanout:将发送到Exchange的所有消息发布到与其绑定的所有队列。direct:将消息发布到绑定键与路由键完全匹配的队列。topic:将消息路由到其绑定键与路由键模式匹配的队列。这里基于springboot集成消息队列,测试这三种Exchange。启动RabbitMQ双击运行rabbitmq-server.batSpringBoot集成RabbitMQ-直接模式(默认模式)创建springbootweb项目-senderspringboot-sender附加测试和rabbitmq需要的依赖org.springframework.bootspring-boot-starter-amqporg.springframework.bootspring-boot-testjunitjunitorg.springframeworkspring-test5.0.9.RELEASE修改配置文件application.yml或application.properties:server:port:7001弹簧:应用程序:名称:spirngboot-senderrabbitmq:主机:127.0.0.1端口:5672username:guestpassword:客人发送的信息,可以是基本数据类型,也可以是对象,这里创建一个用户对象publicclassUserimplementsSerializable{privateStringusername;私有字符串密码;publicStringgetUsername(){返回用户名;}publicvoidsetUsername(Stringusername){this.username=username;}publicStringgetPassword(){返回密码;}publicvoidsetPassword(Stringpassword){this.password=password;}}创建一个配置类:SenderConfiguration.java一个名为queue1的队列@ConfigurationpublicclassSenderConfiguration{@BeanpublicQueuedirectQueue(){returnnewQueue("queue1");}}创建发送消息类:SenderService.java发送用户对象到queue1队列@ComponentpublicclassSenderService{@AutowiredprivateAmqpTemplatetemplate;publicvoidsendUser(){用户user=newUser();user.setUsername("张三");user.setPassword("123456");模板.convertAnd发送(“队列1”,用户);}}创建一个测试类:TestRabbitMQ.java@SpringBootTest(classes=SpringbootSenderApplication.class)@RunWith(SpringJUnit4ClassRunner.class)publicclassTestRabbitMQ{@AutowiredprivateSenderServicesenderService;@TestpublicvoidtestRabbit(){senderService.sendUser();}}运行testRabbit方法:创建一个springbootweb项目-receiverspringboot-receiver修改配置文件application.yml或application.properties:server:port:7002spring:application:name:spirngboot-receiverrabbitmq:host:127.0.0.1port:5672用户名:guest密码:guest添加接收类:ReceiverService.java@ComponentpublicclassReceiverService{@RabbitListener(queues="queue1")publicvoidreceiveUser(Useruser){System.out.println("username:"+user.getUsername()+"密码:"+user.getPassword());}}运行启动类:SpringbootApplication.java,结果:信息接收成功SpringBoot集成了RabbitMQ——Topic模式(模糊匹配),步骤与Direct类似。Sender:修改配置类SenderConfiguration.java:创建两个队列topic1和topic2,创建topicswitch,绑定switch和queue,绑定规则@TestpublicvoidtestRabbit(){senderService.sendUser();}@Bean(name="topic1")publicQueuetopicQueue1(){returnnewQueue("topic1");}@Bean(name="topic2")publicQueuetopicQueue2(){returnnewQueue("topic2");}@BeanpublicTopicExchangeexchange(){//创建主题交换器returnnewTopicExchange("topicExchange");}@BeanBindingbindingExchangeTopic1(@Qualifier("topic1")QueuequeueMessage,TopicExchangeexchange){//设置topic1绑定规则returnBindingBuilder.bind(queueMessage).to(exchange).with("topic.queue");}@BeanBindingbindingExchangeTopic2(@Qualifier("topic2")QueuequeueMessages,TopicExchangeexchange){//设置topic2绑定规则*表示一个词,#表示零个或多个词returnBindingBuilder.bind(queueMessages).to(exchange).with("topic.#");}修改发送类SenderService.java:Useruser=newUser();user.setUsername("张三");user.setPassword("123456");//发送到topicExchange开关template.convertAndSend("topicExchange","topic.queue",user);template.convertAndSend("topicExchange","topic.anyting",用户);运行testRabbit方法:成功广播两条消息Receiver:修改接收类ReceiverService.java:@RabbitListener(queues="fanout1")publicvoidreceiveFanout1(Useruser){System.out.println("Queue:fanout1username:"+user.getUsername()+"password:"+user.getPassword());}@RabbitListener(queues="fanout2")publicvoidreceiveFanout2(Useruser){System.out.println("Queue:fanout2username:"+user.getUsername()+"password:"+user.getPassword());}运行启动类,结果:消息收发成功