问题背景
在企业级开发中,我们经常遇到这样的场景:系统已经使用了自己的 rabbitmq 处理核心业务,但又需要对接第三方系统的 rabbitmq。由于 spring boot 默认只支持单个 rabbitmq 连接配置,直接添加第二个连接会导致配置冲突。
本文将详细介绍如何优雅地解决这个问题。
核心思路
spring boot 默认只支持单个 rabbitmq 连接,当需要对接多个 rabbitmq 时,核心思路是:
- 保留默认配置:主业务继续使用 spring boot 的默认 rabbitmq 配置
- 自定义额外连接:为每个额外的 rabbitmq 创建独立的 connectionfactory、rabbittemplate 和 listenercontainerfactory
- bean 隔离:使用
@qualifier注解区分不同的 rabbitmq bean - 指定连接源:在发送消息和监听消息时明确指定使用哪个 rabbitmq 连接
实战案例:对接两个 rabbitmq
假设我们的系统需要:
- 主 rabbitmq:处理核心业务消息
- 第三方 rabbitmq:对接外部系统消息
1. 配置文件
# 主 rabbitmq(默认)
spring:
rabbitmq:
host: localhost
port: 5672
username: admin
password: admin123
virtual-host: /
# 第三方 rabbitmq
third-party:
rabbitmq:
host: 192.168.1.100
port: 5672
username: guest
password: guest
virtual-host: /external
2. 第三方 rabbitmq 配置类
@configuration
@configurationproperties(prefix = "third-party.rabbitmq")
@data
public class thirdpartyrabbitconfig {
private string host;
private int port;
private string username;
private string password;
private string virtualhost;
/**
* 第三方 rabbitmq 连接工厂
*/
@bean("thirdpartyconnectionfactory")
public connectionfactory thirdpartyconnectionfactory() {
cachingconnectionfactory factory = new cachingconnectionfactory();
factory.sethost(host);
factory.setport(port);
factory.setusername(username);
factory.setpassword(password);
factory.setvirtualhost(virtualhost);
return factory;
}
/**
* 第三方 rabbitmq 发送模板
*/
@bean("thirdpartyrabbittemplate")
public rabbittemplate thirdpartyrabbittemplate(
@qualifier("thirdpartyconnectionfactory") connectionfactory connectionfactory) {
return new rabbittemplate(connectionfactory);
}
/**
* 第三方 rabbitmq 监听器工厂
*/
@bean("thirdpartylistenerfactory")
public simplerabbitlistenercontainerfactory thirdpartylistenerfactory(
@qualifier("thirdpartyconnectionfactory") connectionfactory connectionfactory) {
simplerabbitlistenercontainerfactory factory = new simplerabbitlistenercontainerfactory();
factory.setconnectionfactory(connectionfactory);
return factory;
}
}
3. 消息发送:指定不同的 rabbitmq
@service
@slf4j
public class messagesender {
// 主 rabbitmq(默认)
@autowired
private rabbittemplate rabbittemplate;
// 第三方 rabbitmq
@autowired
@qualifier("thirdpartyrabbittemplate")
private rabbittemplate thirdpartyrabbittemplate;
/**
* 发送到主 rabbitmq
*/
public void sendtomain(string exchange, string routingkey, object message) {
rabbittemplate.convertandsend(exchange, routingkey, message);
log.info("发送到主rabbitmq: {}", message);
}
/**
* 发送到第三方 rabbitmq
*/
public void sendtothirdparty(string exchange, string routingkey, object message) {
thirdpartyrabbittemplate.convertandsend(exchange, routingkey, message);
log.info("发送到第三方rabbitmq: {}", message);
}
}
4. 消息监听:指定不同的 rabbitmq
@component
@slf4j
public class messagelistener {
/**
* 监听主 rabbitmq(使用默认工厂)
*/
@rabbitlistener(queues = "main.queue")
public void handlemainmessage(string message) {
log.info("收到主系统消息: {}", message);
// 处理主业务逻辑
}
/**
* 监听第三方 rabbitmq(指定工厂)
*/
@rabbitlistener(
queues = "external.queue",
containerfactory = "thirdpartylistenerfactory" // 关键:指定监听器工厂
)
public void handlethirdpartymessage(string message) {
log.info("收到第三方消息: {}", message);
// 处理第三方消息
}
}
5. 使用示例
@restcontroller
public class testcontroller {
@autowired
private messagesender messagesender;
@postmapping("/send-main")
public string sendtomain() {
messagesender.sendtomain("main.exchange", "main.key", "hello main!");
return "发送到主rabbitmq成功";
}
@postmapping("/send-third-party")
public string sendtothirdparty() {
messagesender.sendtothirdparty("external.exchange", "external.key", "hello external!");
return "发送到第三方rabbitmq成功";
}
}
核心要点
- bean 命名:为每个额外的 rabbitmq 连接创建带前缀的 bean(如 thirdpartyconnectionfactory)
- 发送消息:注入对应的 rabbittemplate,使用 @qualifier 区分
- 监听消息:在 @rabbitlistener 中指定 containerfactory 参数
- 配置隔离:每个 rabbitmq 使用独立的配置,互不影响
扩展到更多 rabbitmq
如果需要对接更多 rabbitmq,按照相同模式:
- 在配置文件中添加新的连接参数
- 创建新的配置类,定义 connectionfactory、rabbittemplate、listenercontainerfactory
- 在代码中使用 @qualifier 指定具体的 bean
这样可以在一个 spring boot 应用中同时连接任意数量的 rabbitmq 实例,每个连接完全独立,互不干扰。
实际应用场景
- 多租户系统:不同租户使用不同的 rabbitmq 实例
- 第三方集成:对接外部供应商的消息队列系统
- 环境隔离:开发、测试、生产环境使用不同的 rabbitmq
- 业务隔离:核心业务和日志、监控使用独立的消息队列
总结
通过本文介绍的方法,我们可以轻松解决 spring boot 应用中多 rabbitmq 连接的问题。关键在于理解 spring 的 bean 管理机制,合理使用 @qualifier 注解进行 bean 隔离,确保每个 rabbitmq 连接独立工作。
这种方案具有良好的扩展性,可以根据实际业务需求灵活添加更多的 rabbitmq 连接,是企业级应用中处理多消息队列集成的最佳实践。
到此这篇关于springboot多rabbitmq连接集成的实现示例的文章就介绍到这了,更多相关springboot多rabbitmq连接内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论