Spring Boot 配置多源的 RabbitMQ
简介
MQ 是开发中很平常的中间件,本文讲述的是怎么在一个Spring Boot项目中配置多源的RabbitMQ,这里不过多的讲解RabbitMQ的相关知识点。如果你也有遇到需要往多个RabbitMQ中发送消息的需求,希望本文可以帮助到你。
环境
- rabbitmq 3.7.12
- spring boot 2.1.6.RELEASE
当然软件的版本不是硬性要求,只是我使用的环境而已,唯一的要求是需要启动两个RabbitMQ,我这边是在kubernetes集群中使用helm 官方提供的charts包快速启动的两个rabbitmq-ha高可用rabbitmq集群。

想要了解 kubernetes或者helm,可以参看以下 github仓库:
- kubernetes : https://github.com/kubernetes/kubernetes
- helm: https://github.com/helm/helm
- charts: https://github.com/helm/charts
SpringBoot中配置两个RabbitMQ源
在springboot 中配置单个RabbitMQ是极其简单的,我们只需要使用Springboot为我们自动装配的RabbitMQ相关的配置就可以了。但是需要配置多个源时,第二个及其以上的就需要单独配置了,这里我使用的都是单独配置的。
代码:
/**
* @author innerpeacez
* @since 2019/3/11
*/
@Data
public abstract class AbstractRabbitConfiguration {
protected String host;
protected int port;
protected String username;
protected String password;
protected ConnectionFactory connectionFactory() {
CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
connectionFactory.setHost(host);
connectionFactory.setPort(port);
connectionFactory.setUsername(username);
connectionFactory.setPassword(password);
return connectionFactory;
}
}
第一个源的配置代码
package com.zhw.study.springbootmultirabbitmq.config;
import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.amqp.SimpleRabbitListenerContainerFactoryConfigurer;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
/**
* @author innerpeacez
* @since 2019/3/8
*/
@Configuration
@ConfigurationProperties("spring.rabbitmq.first")
public class FirstRabbitConfiguration extends AbstractRabbitConfiguration {
@Bean(name = "firstConnectionFactory")
@Primary
public ConnectionFactory firstConnectionFactory() {
return super.connectionFactory();
}
@Bean(name = "firstRabbitTemplate")
@Primary
public RabbitTemplate firstRabbitTemplate(@Qualifier("firstConnectionFactory") ConnectionFactory connectionFactory) {
return new RabbitTemplate(connectionFactory);
}
@Bean(name = "firstFactory")
public SimpleRabbitListenerContainerFactory firstFactory(SimpleRabbitListenerContainerFactoryConfigurer configurer,
@Qualifier("firstConnectionFactory") ConnectionFactory connectionFactory) {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
configurer.configure(factory, connectionFactory);
return factory;
}
@Bean(value = "firstRabbitAdmin")
public RabbitAdmin firstRabbitAdmin(@Qualifier("firstConnectionFactory") ConnectionFactory connectionFactory) {
return new RabbitAdmin(connectionFactory);
}
}
第二个源的配置代码
package com.zhw.study.springbootmultirabbitmq.config;
import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.amqp.SimpleRabbitListenerContainerFactoryConfigurer;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author innerpeacez
* @since 2019/3/8
*/
@Configuration
@ConfigurationProperties("spring.rabbitmq.second")
public class SecondRabbitConfiguration extends AbstractRabbitConfiguration {
@Bean(name = "secondConnectionFactory")
public ConnectionFactory secondConnectionFactory() {
return super.connectionFactory();
}
@Bean(name = "secondRabbitTemplate")
public RabbitTemplate secondRabbitTemplate(@Qualifier("secondConnectionFactory") ConnectionFactory connectionFactory) {
return new RabbitTemplate(connectionFactory);
}
@Bean(name = "secondFactory")
public SimpleRabbitListenerContainerFactory secondFactory(SimpleRabbitListenerContainerFactoryConfigurer configurer,
@Qualifier("secondConnectionFactory") ConnectionFactory connectionFactory) {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
configurer.configure(factory, connectionFactory);
return factory;
}
@Bean(value = "secondRabbitAdmin")
public RabbitAdmin secondRabbitAdmin(@Qualifier("secondConnectionFactory") ConnectionFactory connectionFactory) {
return new RabbitAdmin(connectionFactory);
}
}
配置信息
spring:
application:
name: multi-rabbitmq
rabbitmq:
first:
host: 192.168.10.76
port: 30509
username: admin
password: 123456
second:
host: 192.168.10.76
port: 31938
username: admin
password: 123456
测试
这样我们的两个RabbitMQ源就配置好了,接下来我们进行测试使用,为了方便使用,我写了一个MultiRabbitTemplate.class 方便我们使用不同的源。
/**
* @author innerpeacez
* @since 2019/3/8
*/
@Component
public abstract class MultiRabbitTemplate {
@Autowired
@Qualifier(value = "firstRabbitTemplate")
public AmqpTemplate firstRabbitTemplate;
@Autowired
@Qualifier(value = "secondRabbitTemplate")
public AmqpTemplate secondRabbitTemplate;
}
第一个消息发送者类 TestFirstSender.class
/**
* @author innerpeacez
* @since 2019/3/11
*/
@Component
@Slf4j
public class TestFirstSender extends MultiRabbitTemplate implements MessageSender {
@Override
public void send(Object msg) {
log.info("rabbitmq1 , msg: {}", msg);
firstRabbitTemplate.convertAndSend("rabbitmq1", msg);
}
public void rabbitmq1sender() {
this.send("innerpeacez1");
}
}
第二个消息发送者类 TestSecondSender.class
/**
* @author innerpeacez
* @since 2019/3/11
*/
@Component
@Slf4j
public class TestSecondSender extends MultiRabbitTemplate implements MessageSender {
@Override
public void send(Object msg) {
log.info("rabbitmq2 , msg: {}", msg);
secondRabbitTemplate.convertAndSend("rabbitmq2", msg);
}
public void rabbitmq2sender() {
this.send("innerpeacez2");
}
}
动态创建Queue的消费者
/**
* @author innerpeacez
* @since 2019/3/11
*/
@Slf4j
@Component
public class TestFirstConsumer implements MessageConsumer {
@Override
@RabbitListener(bindings = @QueueBinding(value = @Queue("rabbitmq1")
, exchange = @Exchange("rabbitmq1")
, key = "rabbitmq1")
, containerFactory = "firstFactory")
public void receive(Object obj) {
log.info("rabbitmq1 , {}", obj);
}
}
/**
* @author innerpeacez
* @since 2019/3/11
*/
@Slf4j
@Component
public class TestSecondConsumer implements MessageConsumer {
@Override
@RabbitListener(bindings = @QueueBinding(value = @Queue("rabbitmq2")
, exchange = @Exchange("rabbitmq2")
, key = "rabbitmq2")
, containerFactory = "secondFactory")
public void receive(Object obj) {
log.info("rabbitmq2 , {}", obj);
}
}
测试类
@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class SpringBootMultiRabbitmqApplicationTests extends MultiRabbitTemplate {
@Autowired
private TestFirstSender firstSender;
@Autowired
private TestSecondSender secondSender;
/**
* 一百个线程向 First Rabbitmq 的 rabbitmq1 queue中发送一百条消息
*/
@Test
public void testFirstSender() {
for (int i = 0; i < 100; i++) {
new Thread(() ->
firstSender.rabbitmq1sender()
).start();
}
try {
Thread.sleep(1000 * 10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
/**
* 一百个线程向 Second Rabbitmq 的 rabbitmq2 queue中发送一百条消息
*/
@Test
public void testSecondSender() {
for (int i = 0; i < 100; i++) {
new Thread(() ->
secondSender.rabbitmq2sender()
).start();
}
try {
Thread.sleep(1000 * 10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
测试结果:


总结
这样配置好之后我们就可向两个RabbitMQ中发送消息啦。这里只配置了两个源,当然如果你需要更多的源,仅仅只需要配置*RabbitConfiguration.class就可以啦。本文没有多说关于RabbitMQ的相关知识,如果未使用过需要自己了解一下相关知识。
Spring Boot 配置多源的 RabbitMQ的更多相关文章
- spring boot 2.0 源码分析(一)
在学习spring boot 2.0源码之前,我们先利用spring initializr快速地创建一个基本的简单的示例: 1.先从创建示例中的main函数开始读起: package com.exam ...
- spring boot 2.0 源码分析(四)
在上一章的源码分析里,我们知道了spring boot 2.0中的环境是如何区分普通环境和web环境的,以及如何准备运行时环境和应用上下文的,今天我们继续分析一下run函数接下来又做了那些事情.先把r ...
- spring boot 配置访问其他模块包中的mapper和xml
maven项目结构如下,这里只是简单测试demo,使用的springboot版本为2.1.3.RELEASE 1.comm模块主要是一些mybatis的mapper接口和对应的xml文件,以及数据库表 ...
- Spring Boot 配置 - Consul 配置中心
▶ Spring Boot 依赖与配置 Maven 依赖 <dependencyManagement> <dependencies> <dependency> &l ...
- Spring Boot配置过滤器的两种方式
过滤器(Filter)是Servlet中常用的技术,可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截,常用的场景有登录校验.权限控制.敏感词过滤等,下面介绍下Spring Boot配置过 ...
- Redis篇之操作、lettuce客户端、Spring集成以及Spring Boot配置
Redis篇之操作.lettuce客户端.Spring集成以及Spring Boot配置 目录 一.Redis简介 1.1 数据结构的操作 1.2 重要概念分析 二.Redis客户端 2.1 简介 2 ...
- Spring Boot -- 配置切换指南
一般在一个项目中,总是会有好多个环境.比如: 开发环境 -> 测试环境 -> 预发布环境 -> 生产环境 每个环境上的配置文件总是不一样的,甚至开发环境中每个开发者的环境可能也会有一 ...
- Spring Boot 配置优先级顺序
一般在一个项目中,总是会有好多个环境.比如: 开发环境 -> 测试环境 -> 预发布环境 -> 生产环境 每个环境上的配置文件总是不一样的,甚至开发环境中每个开发者的环境可能也会有一 ...
- spring boot 配置注入
spring boot配置注入有变量方式和类方式(参见:<spring boot 自定义配置属性的各种方式>),变量中又要注意静态变量的注入(参见:spring boot 给静态变量注入值 ...
随机推荐
- vSphere SDK for Java - 为虚拟机添加磁盘
示例代码: import com.vmware.vim25.*; import com.vmware.vim25.mo.*; import org.springframework.stereotype ...
- Window及document对象
注:页面上元素name属性以及JavaScript引用的名称必须一致包括大小写 否则会提示你1个错误信息 "引用的元素为空或者不是对象" 一.Window对象 ---------- ...
- ng2 空标签
<ng-container *ngIf="v.products"> <li class="clearfix" *ngFor="let ...
- (CSDN迁移) html中的rel属性
在页面上若需要同时存在多个页面,就通过一个button开启一个页面时,就需要指定不同的 rel="relName". 否则新页面就会将就原有的页面给覆盖掉.
- POJ 3624 Charm Bracelet(01背包模板题)
题目链接 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 52318 Accepted: 21912 Descriptio ...
- ThinkPHP3(命名空间、RBAC)
命名空间 当开发大型项目的时候,可以会需要成千上万的文件 面向对象通过命名空间来解决这个问题的. PHP命名空间是PHP5.3以后才出现的. 命名空间中可以出现:类,函数,常量 只有const定义的常 ...
- pat 1100
1100 Mars Numbers (20 分) People on Mars count their numbers with base 13: Zero on Earth is called ...
- JVM内存调优原则及几种JVM内存调优方法
转载,如需帮助,请联系wlgchun@163.com https://blog.csdn.net/LeegooWang/article/details/88696195 如何对JVM进行内存调优? ...
- LeetCode第154场周赛(Java)
估计要刷很久才能突破三道题了.还是刷的太少.尽管对了前两题,但是我觉得写的不怎么样.还是将所有题目都写一下吧. 5189. "气球" 的最大数量 题目比较简单.就是找出一个字符串中 ...
- count_if 功能模板
count_if 功能模板 template <class InputIterator, class UnaryPredicate> typename iterator_traits< ...