3交换机的第二种类型:topic

1 topic 主题模型

1.1 生产者

1.1.1 引入依赖

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

1.1.2 编写配置文件

spring:
  application:
    name: biz-publisher
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest
#    publisher-confirms: true
    publisher-returns: true
    publisher-confirm-type: correlated
server:
  port: 8071


1.1.3 编写配置类(指定了交换机)

package fastwave.cloud.demo.fastwavebizpublisher.config;


import org.springframework.amqp.core.TopicExchange;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class BlogConfig {

    @Bean
    TopicExchange BlogExchange()
    {
        return  new TopicExchange("BlogExchange");
    }

}


1.1.4 编写controller(发送到哪个交换机,以及指定key)

package fastwave.cloud.demo.fastwavebizpublisher.controller;

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.Map;

@RestController
@RequestMapping("amqp")
public class AmqpController {

    @Autowired
    RabbitTemplate template;

    @GetMapping("/topic")
    public String sendBlog(@RequestParam Map<String, Object> params)
    {
        String msg = params.get("msg").toString();
        String routingKey = params.get("key").toString();
        template.convertAndSend("BlogExchange", routingKey, msg);
        return "OK";
    }

}

1.2消费者

1.2.1 引入依赖

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

1.2.2 编写配置文件

spring:
  application:
    name: biz-subscriber
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest
server:
  port: 8072


1.2.3 编写配置类(指定了交换机,多个消息队列)

一个交换机和每一个消息队列进行绑定
同时每一个消息队列对应一个key

package fastwave.cloud.demo.fastwavebizsubscriber.config;


import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class BlogConfig {

    @Bean
    TopicExchange BlogExchange()
    {
        return  new TopicExchange("BlogExchange");
    }

    @Bean
    Queue BlogJavaQueue()
    {
        return new Queue("BlogJavaQueue", true);
    }

    @Bean
    Queue BlogDotNetQueue()
    {
        return new Queue("BlogDotNetQueue", true);
    }

    @Bean
    Queue BlogAllQueue()
    {
        return new Queue("BlogAllQueue", true);
    }

    @Bean
    Binding BindingToJavaQueue()
    {
        return BindingBuilder.bind(BlogJavaQueue()).to(BlogExchange()).with("blog.java");
    }

    @Bean
    Binding BindingToDotNetQueue()
    {
        return BindingBuilder.bind(BlogDotNetQueue()).to(BlogExchange()).with("blog.dotNet");
    }

    @Bean
    Binding BindingToAllQueue()
    {
        return BindingBuilder.bind(BlogAllQueue()).to(BlogExchange()).with("blog.#");
    }
}

1.2.4 编写service(@RabbitListener进行监听每一个队列)

package fastwave.cloud.demo.fastwavebizsubscriber.services;

import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
public class BlogReceiver {

    @RabbitListener(queues = "BlogJavaQueue")
    public void receiverJava(String msg)
    {
        System.out.println("收到的JAVA消息是:" + msg);
    }

    @RabbitListener(queues = "BlogDotNetQueue")
    public void receiverDotNet(String msg)
    {
        System.out.println("收到的DotNet消息是:" + msg);
    }

    @RabbitListener(queues = "BlogAllQueue")
    public void receiverAll(String msg)
    {
        System.out.println("收到的ALL消息是:" + msg);
    }
}


1.3 测试

1 启动消费者 和生产者

在这里插入图片描述
2 调用生产端的接口:
在这里插入图片描述

3结果: 有两个队列收到了
在这里插入图片描述

发布了142 篇原创文章 · 获赞 3 · 访问量 5375

猜你喜欢

转载自blog.csdn.net/Insist___/article/details/105271201