RabbitMQ罕用的三种Exchange Type:fanout、direct、topic。

  1. fanout:把所有发送到该Exchange的音讯投递到所有与它绑定的队列中。
  2. direct:把音讯投递到那些binding key与routing key齐全匹配的队列中。
  3. topic:将音讯路由到binding key与routing key模式匹配的队列中。

这里基于springboot整合 音讯队列 ,测试这三种Exchange。

  • 启动RabbitMQ

双击运行rabbitmq-server.bat

  • SpringBoot整合RabbitMQ——Direct模式(默认模式)

创立springboot web我的项目——发送者 springboot-sender

追加测试和rabbitmq所需的依赖

<!-- 增加springboot对amqp的反对 --><dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-amqp</artifactId></dependency><!--增加测试包--><dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-test</artifactId></dependency><dependency>  <groupId>junit</groupId>  <artifactId>junit</artifactId></dependency><dependency>  <groupId>org.springframework</groupId>  <artifactId>spring-test</artifactId>  <version>5.0.9.RELEASE</version></dependency>

批改配置文件 application.yml application.properties:

server:  port: 7001spring:  application:    name: spirngboot-sender    rabbitmq:      host: 127.0.0.1      port: 5672      username: guest      password: guest

发送的信息能够是 根本数据类型 也能够是 对象 ,这里创立一个用户对象

public class User implements Serializable{    private String username;    private String password;    public String getUsername() {        return username;    }    public void setUsername(String username) {        this.username = username;    }    public String getPassword() {        return password;    }    public void setPassword(String password) {        this.password = password;    }}

创立一个配置类: SenderConfiguration.java

一个名为 queue1 的 队列

@Configurationpublic class SenderConfiguration {    @Bean    public Queue directQueue() {        return new Queue("queue1");    }}

创立一个发送信息类: SenderService.java

发送 user 对象给 queue1 队列

@Componentpublic class SenderService {    @Autowired    private AmqpTemplate template;    public void sendUser() {        User user=new User();        user.setUsername("张三");        user.setPassword("123456");        template.convertAndSend("queue1",user);    }}

创立一个测试类: TestRabbitMQ.java

@SpringBootTest(classes=SpringbootSenderApplication.class)@RunWith(SpringJUnit4ClassRunner.class)public class TestRabbitMQ {    @Autowired    private SenderService senderService;    @Test    public void testRabbit() {        senderService.sendUser();    }}

运行 testRabbit 办法:

创立springboot web我的项目——接收者 springboot-receiver

批改配置文件 application.yml application.properties:

server:  port: 7002spring:  application:    name: spirngboot-receiver    rabbitmq:      host: 127.0.0.1      port: 5672      username: guest      password: guest

增加接管类: ReceiverService.java

@Componentpublic class ReceiverService {    @RabbitListener(queues="queue1")    public void receiveUser(User user) {        System.out.println("username:"+user.getUsername()+" password:"+user.getPassword());    }}

运行启动类:SpringbootApplication.java,后果:

信息胜利被接管。

SpringBoot整合RabbitMQ——Topic模式(含糊匹配)

步骤与Direct差不多。

发送者:

批改配置类SenderConfiguration.java:

创立两个队列 topic1,topic2,创立一个topic交换器,绑定交换机和队列以及绑定规定

@Testpublic void testRabbit() {    senderService.sendUser();}@Bean(name="topic1")public Queue topicQueue1() {    return new Queue("topic1");}@Bean(name="topic2")public Queue topicQueue2() {    return new Queue("topic2");}@Beanpublic TopicExchange exchange() {    //创立一个topic交换器    return new TopicExchange("topicExchange");}@BeanBinding bindingExchangeTopic1(@Qualifier("topic1") Queue queueMessage, TopicExchange exchange) {    //设置topic1绑定规定    return BindingBuilder.bind(queueMessage).to(exchange).with("topic.queue");}@BeanBinding bindingExchangeTopic2(@Qualifier("topic2") Queue queueMessages, TopicExchange exchange) {     //设置topic2绑定规定 *示意一个词,#示意零个或多个词    return BindingBuilder.bind(queueMessages).to(exchange).with("topic.#");}

批改发送类 SenderService.java

User user=new User();user.setUsername("张三");user.setPassword("123456");//发送给topicExchange的交换机template.convertAndSend("topicExchange","topic.queue",user);template.convertAndSend("topicExchange","topic.anyting",user);

运行 testRabbit 办法:

胜利播送进来两条信息

接收者:

批改接管类 ReceiverService.java

@RabbitListener(queues="fanout1")public void receiveFanout1(User user) {    System.out.println("队列:fanout1 username:"+user.getUsername()+" password:"+user.getPassword());}@RabbitListener(queues="fanout2")public void receiveFanout2(User user) {    System.out.println("队列:fanout2 username:"+user.getUsername()+" password:"+user.getPassword());}

运行启动类,后果:

音讯胜利被发送接管