SpringBoot整合RabbitMQ实现交换机与队列的绑定

 更新时间:2022年05月28日 09:50:32   作者:IT利刃出鞘  
这篇文章将通过几个实例为大家介绍一些SpringBoot中RabbitMQ如何绑定交换机(交换器)与队列,文中的示例代码讲解详细,感兴趣的可以了解一下

简介

本文用实例介绍SpringBoot中RabbitMQ如何绑定交换机(交换器)与队列。

配置方法概述

交换机

下边两种方式等价。

ExchangeBuilder.topicExchange(EXCHANGE_TOPIC_WELCOME).durable(true).build();
new TopicExchange(EXCHANGE_TOPIC_WELCOME, true, false)

队列

下边两种方式等价

QueueBuilder.durable("Hi").build();
new Queue(QUEUE_HI, true)

绑定

下边两种方式等价

注意:第一种的参数并不是字符串。

BindingBuilder.bind(helloQueue).to(welcomExchange).with("hello.#")
new Binding("Queue@hello", Binding.DestinationType.QUEUE,
                "Exchange@topic.welcome", "hello.#", null)

法1:配置类(简洁方法)(推荐)

package com.example.config;
 
import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
@Configuration
public class RabbitMQRouterConfig {
    public static final String QUEUE_HELLO              = "Queue@hello";
    public static final String QUEUE_HI                 = "Queue@hi";
    public static final String EXCHANGE_TOPIC_WELCOME   = "Exchange@topic.welcome";
    public static final String ROUTINGKEY_HELLOS        = "hello.#";
 
    @Autowired
    private AmqpAdmin amqpAdmin;
 
    @Bean
    public Object initBindingTest() {
        amqpAdmin.declareExchange(new TopicExchange(EXCHANGE_TOPIC_WELCOME, true, false));
 
        amqpAdmin.declareQueue(new Queue(QUEUE_HI, true));
        amqpAdmin.declareQueue(new Queue(QUEUE_HELLO, true));
 
        amqpAdmin.declareBinding(new Binding(QUEUE_HELLO, Binding.DestinationType.QUEUE,
                EXCHANGE_TOPIC_WELCOME, ROUTINGKEY_HELLOS, null));
 
        return new Object();
    }
}

amqpAdmin.declareBinding

需要一个Binding对象作为参数

  1. exchange:交换器名称
  2. type:交换器类型。BuiltinExchangeType枚举类,有以下4中类型交换器:DIRECT(“direct”), FANOUT(“fanout”), TOPIC(“topic”), HEADERS(“headers”)
  3. durable:设置是否持久化。true:持久化,false:非持久化。持久化可以将交换器存盘,在服务器重启时不会丢失相关消息。
  4. autoDelete:设置是否自动删除。true:自动删除,false:不自动删除。自动删除的前提是至少有一个队列或交换器与这个交换器绑定,之后所有与这个交换器绑定的队列或交换器都与此交换器解绑。
  5. internal:设置是否内置的。true:内置交换器,false:非内置交换器。内置交换器,客户端无法直接发送消息到这个交换器中,只能通过交换器路由到交换器这种方式。
  6. arguments:其他一些结构化参数。如备份交换器:alternate-exchange、超时时间。示例配置超时时间方法:
Map<String, Object> params = new HashMap();
params.put("x-message-ttl", 2000);
amqpAdmin.declareBinding(new Binding(QUEUE_HELLO, Binding.DestinationType.QUEUE,
                EXCHANGE_TOPIC_WELCOME, ROUTINGKEY_HELLOS, params));

法2:配置类(繁琐方法)(不推荐)

不推荐的原因

适用于队列和交换器不多时。

代码示例

package com.lly.order.message;
 
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
@Configuration
public class RabbitMQConfig {
    public final static String QUEUE_DIRECT     = "Queue@direct";
    public final static String QUEUE_TOPIC_ONE  = "Queue@topic_one";
    public final static String TOPIC_QUEUE_TWO  = "Queue@topic_two";
    public final static String QUEUE_FANOUT_ONE = "Queue@fanout_one";
    public final static String QUEUE_FANOUT_TWO = "Queue@fanout_two";
 
    public final static String EXCHANGE_TOPIC   = "Exchange@topic";
    public final static String EXCHANGE_FANOUT  = "Exchange@fanout";
 
    public final static String ROUTINGKEY_TOPIC_ONE = "hello.key";
    public final static String ROUTINGKEY_TOPIC_TWO = "*.key";
 
	//  direct模式队列
    @Bean
    public Queue directQueue() {
        return new Queue(QUEUE_DIRECT, true);
    }
	
	//  topic 订阅者模式队列
    @Bean
    public Queue topicQueueOne() {
        return new Queue(QUEUE_TOPIC_ONE, true);
    }
    @Bean
    public Queue topicQueueTwo() {
        return new Queue(TOPIC_QUEUE_TWO, true);
    }
	
	//  fanout 广播者模式队列
    @Bean
    public Queue fanoutQueueOne() {
        return new Queue(QUEUE_FANOUT_ONE, true);
    }
    @Bean
    public Queue fanoutQueueTwo() {
        return new Queue(QUEUE_FANOUT_TWO, true);
    }
	
	//  topic 交换器
    @Bean
    public TopicExchange topExchange() {
        return new TopicExchange(EXCHANGE_TOPIC);
    }
	
	//  fanout 交换器
    @Bean
    public FanoutExchange fanoutExchange() {
        return new FanoutExchange(EXCHANGE_FANOUT);
    }
 
	//   订阅者模式绑定
    @Bean
    public Binding topicExchangeBingingOne() {
        return BindingBuilder.bind(topicQueueOne()).to(topExchange()).with(ROUTINGKEY_TOPIC_ONE);
    }
 
    @Bean
    public Binding topicExchangeBingingTwo() {
        return BindingBuilder.bind(topicQueueTwo()).to(topicExchange()).with(ROUTINGKEY_TOPIC_TWO);
    }
	
	//   广播模式绑定
    @Bean
    public Binding fanoutExchangeBingingOne() {
        return BindingBuilder.bind(fanoutQueueOne()).to(fanoutExchange());
    }
 
    @Bean
    public Binding fanoutExchangeBingingTwo() {
        return BindingBuilder.bind(fanoutQueueTwo()).to(fanoutExchange());
    }
}

法3:使用方配置(不推荐)

不推荐的原因

RabbitMQ的配置最好是统一在一个地方配置,分散配置不利于后期维护。

使用方法

@Component
public class Receiver {
    @RabbitListener(queues = "hello")
    public void process(String hello) {
        System.out.println ("Receiver : "  + hello);
    }
 
	@RabbitListener(bindings = @QueueBinding(
			exchange = @Exchange(value = "Exchange@topic.Hello",durable = "true",type = "topic"),
			value    = @Queue(value = "Queue@Hello",durable = "true"),
			key      = "key.#"
	))
	public void processMessage1(Message message) {
		System.out.println(message);
	}
}

法4:MQ服务端网页(不推荐)

不推荐的原因

使用方法

添加交换器

http://localhost:15672/#/exchanges   //例如:Exchange@topic.Hello

添加队列

http://localhost:15672/#/queues            //例如:Queue@Hello

交换器添加路由键

http://localhost:15672/#/exchanges=> 点击交换器名字=> Binding=> 添加队列与路由

到此这篇关于SpringBoot整合RabbitMQ实现交换机与队列的绑定的文章就介绍到这了,更多相关SpringBoot RabbitMQ绑定交换机 队列内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java集合中的WeakHashMap、IdentityHashMap、EnumMap详解

    Java集合中的WeakHashMap、IdentityHashMap、EnumMap详解

    这篇文章主要介绍了Java集合中的WeakHashMap、IdentityHashMap、EnumMap详解,HashMap的key保留了对实际对象的强引用,这意味着只要HashMap对象不被销毁,还HashMap的所有key所引用的对象就不会被垃圾回收,需要的朋友可以参考下
    2023-09-09
  • 你肯定能看懂的Java IO相关知识总结

    你肯定能看懂的Java IO相关知识总结

    群里有大佬说想让我写一篇NIO,一直也没写,但是和同事聊天也说对Java的IO不是很清晰,因此今天就写下Java的io,先打个基础,下次写NIO,需要的朋友可以参考下
    2021-05-05
  • Java线程池流程编排运用实战源码

    Java线程池流程编排运用实战源码

    这篇文章主要介绍了Java线程池流程编排运用实战源码,就在流程引擎的基础上运用 ThreadPoolExecutor,使用线程池实现 SpringBean 的异步执行
    2022-03-03
  • java正则表达式学习笔记之命名捕获

    java正则表达式学习笔记之命名捕获

    这篇文章主要为大家详细介绍了java正则表达式中的命名捕获,感兴趣的小伙伴们可以参考一下
    2016-02-02
  • SpringSecurity实现动态加载权限信息的方法

    SpringSecurity实现动态加载权限信息的方法

    这篇文章主要介绍了SpringSecurity实现动态加载权限信息,本文给大家介绍的非常详细,对大家的学习或工作具有一定需要的朋友可以参考下
    2022-01-01
  • SpringBoot JavaMailSender发送邮件功能(实例详解)

    SpringBoot JavaMailSender发送邮件功能(实例详解)

    JavaMailSender是Spring提供的,非常好用的,实现邮件发送的接口 ,这篇文章主要介绍了SpringBoot JavaMailSender发送邮件功能,需要的朋友可以参考下
    2024-03-03
  • 详解Java中的ReentrantLock锁

    详解Java中的ReentrantLock锁

    这篇文章主要介绍了Java中ReentrantLock锁的相关资料,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
    2021-01-01
  • Mybatis-Plus BaseMapper的用法详解

    Mybatis-Plus BaseMapper的用法详解

    这篇文章主要介绍了Mybatis-Plus BaseMapper的用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • SpringBoot拦截器使用精讲

    SpringBoot拦截器使用精讲

    拦截器可以根据 URL 对请求进行拦截,主要应用于登陆校验、权限验证、乱码解决、性能监控和异常处理等功能上。SpringBoot同样提供了拦截器功能。 本文将为大家详细介绍一下
    2021-12-12
  • springcloud连接远程nacos失败显示localhost服务连接失败的问题解决

    springcloud连接远程nacos失败显示localhost服务连接失败的问题解决

    这篇文章主要介绍了springcloud连接远程nacos失败显示localhost服务连接失败的问题解决,文中有详细的代码示例供大家参考,对大家解决问题有一定的帮助,需要的朋友可以参考下
    2024-03-03

最新评论