四、Spring 声明队列和交换机

本文介绍了SpringAMQP中基于配置类注册的Fanout、Direct和Topic模式,以及使用@RabbitListener注解声明队列和交换机的方法,详细展示了队列、交换机和绑定的创建方式。
摘要由CSDN通过智能技术生成

0、简介

Spring AMQP 提供了几个类,用来声明队列、交换机及其绑定关系:

  • Queue:用于声明队列,可用工厂类 QueueBuilder 构建
  • Exchange:用于声明交换机,可用工厂类 ExchangeBuilder 构建
  • Binding:用于绑定关系,可用工厂类 BindingBuilder 构建

在这里插入图片描述


1、基于配置类注册

1.1、Fanout

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

@Configuration
public class MyRabbitFanoutConfig {

    // Exchange 第一种:直接new
    @Bean
    public FanoutExchange fanoutExchange1(){
        return new FanoutExchange("myJavaFanout1");
    }

    // Exchange 第二种:ExchangeBuilder
    @Bean
    public FanoutExchange fanoutExchange2(){
       return (FanoutExchange)ExchangeBuilder.fanoutExchange("myJavaFanout2").build();
    }

    // Queue 第一种:直接new :默认是durable
    @Bean
    public Queue queue1(){
        return new Queue("myJavaQueue1");
    }

    // Queue 第二种:QueueBuilder :durable 持久化    nonDurable:非持久化
    @Bean
    public Queue queue2(){
        return QueueBuilder.durable("myJavaQueue2").build();
    }

    // Binding 方式一:直接传参
    @Bean
    public Binding fanoutBinding1(Queue queue1, FanoutExchange fanoutExchange1){
        // 直接用 BindingBuilder 方便
        return BindingBuilder.bind(queue1).to(fanoutExchange1);
    }

    // Binding 方式二:直接调用 (通过Spring反向代理获取Bean)
    @Bean
    public Binding fanoutBinding2(){
        return BindingBuilder.bind(queue2()).to(fanoutExchange2());
    }
}

1.2、Direct

每绑定一个 routingKey 就得写一个 Bean,基于配置类注册 Direct 交换机就比较麻烦。

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

@Configuration
public class MyRabbitDirectConfig {

    @Bean
    public DirectExchange directExchange(){
        return new DirectExchange("myJavaDirect");
    }

    @Bean
    public Queue directQueue(){
        return new Queue("myJavaDirectQueue1");
    }

    // 每绑定一个 routingKey 就得写一个 Bean
    @Bean
    public Binding directKey1Binding(){
        return BindingBuilder.bind(directQueue()).to(directExchange()).with("key1");
    }

    // 每绑定一个 routingKey 就得写一个 Bean
    @Bean
    public Binding directKey2Binding(){
        return BindingBuilder.bind(directQueue()).to(directExchange()).with("key2");
    }
}

1.3、Topic

实现与 1.2、Direct 如出一辙,这里不再赘述


2、基于 @RabbitListener 声明

Spring AMPQ 还提供了基于 @RabbitListener 注解来声明队列和交换机的方式。

@Component
public class MyMqConsumerListener {

    @RabbitListener(bindings = @QueueBinding(
        value = @Queue(name = "myQueue666", durable = "true"),
        exchange = @Exchange(name = "myExchange666", type = ExchangeTypes.DIRECT),
        key = {"key1", "key2"}
    ))
    public void myInitListener(String msg) {
        System.err.println("\nmyQueue666接到了来自myExchange666的消息:" + msg);
    }
}
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

纯纯的小白

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

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

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

打赏作者

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

抵扣说明:

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

余额充值