当前位置: 首页 > article >正文

RabbitMQ创建交换机和队列——配置类 注解

交换机的类型

Fanout:广播,将消息交给所有绑定到交换机的队列。

Direct:订阅,基于RoutingKey(路由key)发送给订阅了消息的队列。

Topic:通配符订阅,与Direct类似,只不过RoutingKey可以使用通配符(# (一个或多个单词)和 * (一个单词))。

Headers:头匹配,基于MQ的消息头匹配,用的较少。

准备

导入依赖:

        <!--AMQP依赖,包含RabbitMQ-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
        <!--单元测试-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>

配置文件:

spring:
  rabbitmq:
    host: ****** # 你的虚拟机/服务器IP
    port: 5672 # 端口
    virtual-host: **** # mq虚拟主机
    username: *** # 用户名
    password: *** # 密码

这里用direct类型的交换机举例:

基于配置类

步骤一:配置类中创建交换机和队列的Bean,并设置绑定关系,设置routingKey为sdg

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

@Configuration
public class FanoutConfiguration {

    @Bean
    public DirectExchange directExchange() {
        return new DirectExchange("exchange01.direct");
        //或者return ExchangeBuilder.directExchange("exchange01.direct").build();
    }

    @Bean
    public Queue queue() {
        return new Queue("direct.queue01");
    }

    @Bean
    public Binding bind01(DirectExchange directExchange, Queue queue){
        return BindingBuilder.bind(queue).to(directExchange).with("sdg");
    }
}

步骤二:发送者发送消息

    @Test
    public void test5() {
        String exchange = "exchange01.direct";
        String message = "Hello World!";
        rabbitTemplate.convertAndSend(exchange,"sdg",message);
    }

 步骤三:消费者消费消息

package com.itheima.consumer.mq;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Slf4j
@Component
public class SpringRabbitListener {

    @RabbitListener(queues = "direct.queue01")
    public void queue01Listener(String msg) {
        System.out.println("收到消息: "+msg);
    }
}

 direct模式由于要绑定多个KEY,每一个Key都要编写一个binding,会非常麻烦,基于配置类适用与简单的情况,所以我们就可以基于注解来声明交换机、队列和绑定关系

基于注解

消费者:

import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
public class SpringRabbitListener {

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "direct.queue01"),
            exchange = @Exchange(name = "htsdg.direct",type = ExchangeTypes.DIRECT),
            key = {"sdg","ht"}
    ))//默认类型为direct
    public void queue01Listener(String msg) {
        System.out.println("收到消息: "+msg);
    }
}

再来一个topic类型的:

发送者:

    @Test
    public void test5() {
        String exchange = "htsdg.direct";
        String message = "Hello World!";
        rabbitTemplate.convertAndSend(exchange,"china.qianXueSen",message);
    }

消费者:

@RabbitListener(bindings = @QueueBinding(
    value = @Queue(name = "topic.queue1"),
    exchange = @Exchange(name = "htsdg.topic", type = ExchangeTypes.TOPIC),
    key = "china.#"
))
public void listenTopicQueue1(String msg){
    System.out.println("消费者1接收到topic.queue1的消息:【" + msg + "】");
}

@RabbitListener(bindings = @QueueBinding(
    value = @Queue(name = "topic.queue2"),
    exchange = @Exchange(name = "htsdg.topic", type = ExchangeTypes.TOPIC),
    key = "#.news"
))
public void listenTopicQueue2(String msg){
    System.out.println("消费者2接收到topic.queue2的消息:【" + msg + "】");
}


http://www.kler.cn/a/302644.html

相关文章:

  • 嵌入式硬件实战提升篇(一)-泰山派RK3566制作多功能小手机
  • 高级java每日一道面试题-2024年11月06日-JVM篇-什么是 Class 文件? Class 文件主要的信息结构有哪些?
  • FluentUI使用
  • 前缀和技巧解析
  • 论文翻译 | The Capacity for Moral Self-Correction in Large Language Models
  • python制作一个简单的端口扫描器,用于检测目标主机上指定端口的开放状态
  • Idea 创建 Maven项目的时候卡死
  • 体育数据API纳米足球数据API:足球数据接口文档API示例⑫
  • 【解决方案】双系统中修复ubuntu引导
  • 【算法】-单调队列
  • 数据库系统 第43节 数据库复制
  • LabVIEW回转马达试验系统
  • Git撤销add
  • Flutter类
  • Vue:通过js控制css变量 - 一键修改全局样式
  • Docker 常用命令(未完待续...)
  • 外贸网站建设该怎么做
  • Certbot 生成 SSL 证书并配置自动续期
  • android 发一个可以下载的的android studio历史版本
  • 深度学习——pycharm配置远程服务器(蓝耘GPU智算云)
  • JavaScript拷贝的艺术:玩转深拷贝和浅拷贝
  • Arcgis字段计算器:随机生成规定范围内的数字
  • vue2中使用web worker启动定时器
  • 25届计算机专业选题推荐-基于微信小程序的校园快递驿站代收管理系统
  • 修改docker的默认存储位置及镜像存储位置
  • 无人机低空安全管控系统技术详解