RabbitMq——主题(topic)交换机

主题(topic)交换机:该交换机可以更好的以基于多个标准的路由发消息给指定队列。

其路由规则为:routingkey必须为单词列表,单词之间以点号分隔开,*号代表一个单词,#号可以替代零个或多个单词。

举例:

路由*.*.key1绑定队列Q1,如:red.blue.key1、black.green.key1等,通过这些路由都可以发送消息给队列Q1

路由#.key2.*绑定队列Q2,如:a.b.c.key2.red、orange.key2.blue、key2.red等,通过这些路由都可以发送消息给队列Q2

路由key3.#绑定队列Q2,如:key3.red.blue、key3、key3.green、key3.black.blue.red等,通过这些路由都可以将消息发送给Q2

若路由为:#,则该交换机功能与扇出交换机(fanout)功能相同;若路由没有#和*,则该交换机功能与直接交换机功(direct)能相同

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5ZCO56uv5bCP54y_,size_20,color_FFFFFF,t_70,g_se,x_16

 

案例:一个生产者,通过主题交换机发消息给两个消费者,绑定关系如上图

1、连接信道工具类,同时关闭linux防火墙和开启rabbitmq服务

//连接工厂,创建信道工具类
public class RabbitUtils {
    // 得到一个连接的 channel
    public static Channel getChannel() throws Exception {
        // 创建一个连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("192.168.23.111");
        factory.setUsername("user");
        factory.setPassword("123");
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();
        return channel;
    }
}

2、生产者发送消息

        (1)连接信道,声明主题交换机;

        (2)从控制台输入消息,路由,发送消息。

public class Producer {

    public static final String TOPIC_EXCHANGE="topic_exchange";

    public static void main(String[] args) throws Exception {
        //获得信道
        Channel channel = RabbitUtils.getChannel();
        //声明主题交换机
        channel.exchangeDeclare(TOPIC_EXCHANGE, BuiltinExchangeType.TOPIC);
        //发送消息
        Scanner scanner = new Scanner(System.in);
        while (true){
            System.out.print("请输入发送消息:");
            String message=scanner.nextLine();
            System.out.print("请输入发送路由:");
            String routingKey=scanner.nextLine();
            //开始发送消息
            channel.basicPublish(TOPIC_EXCHANGE,routingKey,null,message.getBytes("UTF-8"));
            System.out.println("生产者发送消息:"+message+",经过路由为:"+routingKey+"");
        }

    }
}

3、消费者接收消息

        (1)获取信道,声明队列;

        (2)绑定交换机与队列,绑定路由一定要是单词组;

        (3)调用basicConsumer(队列名,是否自动应答,接受成功回调,接受失败回调)方法接收消息。

public class Consumer1 {
    public static final String TOPIC_EXCHANGE="topic_exchange";

    public static void main(String[] args) throws Exception {
        //获得信道
        Channel channel = RabbitUtils.getChannel();
        //声明队列
        channel.queueDeclare("Q1",false,false,false,null);
        //绑定交换机与队列
        channel.queueBind("Q1",TOPIC_EXCHANGE,"*.*.key1");
        System.out.println("consumer1等待消息接收");
        //接收消息成功回调
        DeliverCallback deliverCallback=(delivery,message)->{
            System.out.println("consumer1收到路由为:"+message.getEnvelope().getRoutingKey()+"的消息:"+new String(message.getBody(),"UTF-8"));
        };
        //接收消息
        channel.basicConsume("Q1",true,deliverCallback,consumerTag->{});
    }
}
public class Consumer2 {
    public static final String TOPIC_EXCHANGE="topic_exchange";

    public static void main(String[] args) throws Exception {
        //获得信道
        Channel channel = RabbitUtils.getChannel();
        //声明队列
        channel.queueDeclare("Q2",false,false,false,null);
        //绑定交换机与队列
        channel.queueBind("Q2",TOPIC_EXCHANGE,"#.key2.*");
        channel.queueBind("Q2",TOPIC_EXCHANGE,"key3.#");
        System.out.println("consumer1等待消息接收");
        //接收消息成功回调
        DeliverCallback deliverCallback=(delivery,message)->{
            System.out.println("consumer2收到路由为:"+message.getEnvelope().getRoutingKey()+"的消息:"+new String(message.getBody(),"UTF-8"));
        };
        //接收消息
        channel.basicConsume("Q2",true,deliverCallback,consumerTag->{});
    }
}

4.测试

发送消息:”你好,consumer1“,路由:red.green.key1,消费者consumer1接受到消息;

发送消息:”你好,consumer2“,路由:red.green.key2.black,消费者consumer2接收到消息;

发送消息:“订单支付成功”,路由:key3.red,消费者consumer2接收到消息;

发送消息:”结算失败“,路由:red.key3.black,消息丢失;

生产者:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5ZCO56uv5bCP54y_,size_20,color_FFFFFF,t_70,g_se,x_16

消费者consumer1:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5ZCO56uv5bCP54y_,size_20,color_FFFFFF,t_70,g_se,x_16消费者consumer2: 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5ZCO56uv5bCP54y_,size_20,color_FFFFFF,t_70,g_se,x_16

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: RabbitMQ是一个基于AMQP协议的消息中间件,提供了丰富的Exchange(交换机)类型来进行消息的路由和分发。其中,topic类型的交换机可以根据消息的routing key来进行灵活的匹配和分发。 在Spring Boot中使用RabbitMQtopic类型交换机,首先需要在配置文件中配置RabbitMQ的连接信息,如主机地址、端口号、用户名、密码等。 其次,需要创建一个RabbitMQ的配置类,使用@Configuration注解进行标识,并使用@EnableRabbit注解启用RabbitMQ相关的配置。在配置类中,可以使用@Bean注解创建一个RabbitTemplate的实例,用于发送和接收消息。 接下来,在生产者中,可以使用@Autowired注解注入RabbitTemplate实例,并调用其convertAndSend方法发送消息到指定的交换机和routing key。生产者可以根据具体的业务需求设置不同的routing key,用于消息的匹配和分发。 在消费者中,同样可以使用@Autowired注解注入RabbitTemplate实例,并调用其receiveAndConvert方法接收消息。消费者需要在配置类中使用@RabbitListener注解,指定要监听的队列,并根据需要设置不同的routing key或通配符进行匹配。 通过Spring Boot中的自动配置,我们可以方便地使用RabbitMQtopic类型交换机进行消息的发布和订阅。同时,使用Spring AMQP提供的注解和模板类,可以简化开发过程,提高代码的可读性和可维护性。 需要注意的是,使用topic类型交换机时,routing key是由一个或多个单词组成的字符串,用点号(.)进行分隔。其中,单词可以包含字母、数字或通配符(#和*)。#用于匹配零个或多个单词,*用于匹配一个单词。 总之,通过使用RabbitMQtopic类型交换机和Spring Boot提供的自动配置和注解,我们可以方便地实现消息的灵活路由和分发,满足不同业务场景的需求。 ### 回答2: RabbitMQ是一个开源的消息中间件,用于实现可靠的消息传递。它使用AMQP(高级消息队列协议)作为消息传输协议,并通过交换机来路由消息。 Topic类型的交换机RabbitMQ中是一种灵活的交换机类型。它通过使用通配符的方式将消息路由到与匹配的路由键相关联的队列。使用Spring Boot框架与RabbitMQ集成,可以方便地实现Topic类型的交换机。 首先,在Spring Boot项目中引入RabbitMQ的依赖,例如: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> ``` 然后,配置RabbitMQ的连接信息,例如: ```yaml spring: rabbitmq: host: localhost port: 5672 username: guest password: guest ``` 接下来,在代码中创建一个Topic类型的交换机,例如: ```java @Configuration public class RabbitMQConfig { private static final String TOPIC_EXCHANGE_NAME = "topicExchange"; @Bean public TopicExchange topicExchange() { return new TopicExchange(TOPIC_EXCHANGE_NAME); } } ``` 然后,创建一个消费者来监听队列中的消息,例如: ```java @Component public class MessageListener { private static final String QUEUE_NAME = "messageQueue"; private static final String ROUTING_KEY = "message.*"; @RabbitListener(queues = QUEUE_NAME) public void handleMessage(String message) { System.out.println("Received message: " + message); } } ``` 最后,通过发送消息的方式来测试Topic类型的交换机,例如: ```java @Service public class MessageService { private static final String ROUTING_KEY = "message.test"; @Autowired private RabbitTemplate rabbitTemplate; public void sendMessage(String message) { rabbitTemplate.convertAndSend(TOPIC_EXCHANGE_NAME, ROUTING_KEY, message); } } ``` 以上是使用Spring Boot与RabbitMQ实现Topic类型交换机的基本步骤。通过配置交换机、监听队列和发送消息,可以实现灵活的消息路由机制,满足不同的业务需求。 ### 回答3: RabbitMQ是一种开源的消息代理,用于在分布式系统之间传递消息。它支持多种类型的交换机,其中之一就是Topic类型。 在使用Spring Boot集成RabbitMQ时,我们可以通过配置文件或代码的方式来定义Topic类型的交换机。 首先,在配置文件中我们需要定义RabbitMQ的连接信息,如主机名、端口号、用户名和密码等。同时,我们也需要配置交换机的相关信息,包括交换机名称、类型和持久化等。 例如,我们可以在application.properties文件中添加以下配置: spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest spring.rabbitmq.template.exchange=myExchange spring.rabbitmq.template.routing-key=myTopic 上述配置中,我们定义了RabbitMQ的连接信息和交换机的相关信息。其中,exchange为我们自定义的交换机名称,routing-key为我们自定义的Topic名称。 接下来,在代码中我们可以通过使用注解的方式,将RabbitTemplate对象注入到我们的业务逻辑中。然后,通过调用RabbitTemplate对象的convertAndSend方法来发送消息。 例如,我们可以通过以下方式来发送消息: @Autowired private RabbitTemplate rabbitTemplate; public void sendMessage(String message) { rabbitTemplate.convertAndSend("myExchange", "myTopic", message); } 上述代码中,我们通过调用rabbitTemplate对象的convertAndSend方法来发送消息。其中,第一个参数为交换机名称,第二个参数为Topic名称,第三个参数为要发送的消息内容。 总结一下,通过配置文件和代码的方式,我们可以在Spring Boot中使用RabbitMQTopic类型交换机。只需要定义好RabbitMQ的连接信息和交换机的相关信息,然后调用RabbitTemplate对象的convertAndSend方法来发送消息即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

swttws.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值