SpringBoot 集成多个rabbitmq
1. pom.xml 配置
<!-- RabbitMQ -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2. 配置文件
spring:
rabbitmq:
first:
host: 101.22.08.161
port: 5672
username: dhcs
password: dhcs
virtualhost: /
second:
host: 101.32.80.138
port: 5672
username: admin
password: admin
virtualhost: /account
3. 编写配置类
package com.example.mybatis.config.mq;
import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.amqp.SimpleRabbitListenerContainerFactoryConfigurer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
@Configuration
public class RabbitMQConfig {
public CachingConnectionFactory connectionFactory(String host, int port, String username, String password, String virtualhost) {
CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
connectionFactory.setHost(host);
connectionFactory.setPort(port);
connectionFactory.setUsername(username);
connectionFactory.setPassword(password);
connectionFactory.setVirtualHost(virtualhost);
return connectionFactory;
}
// ============================================ 定义连接connectionFactory ====================================================================
@Bean(name = "mainConnectionFactory")
@Primary
public ConnectionFactory mainConnectionFactory(
@Value("${spring.rabbitmq.first.host}") String host,
@Value("${spring.rabbitmq.first.port}") int port,
@Value("${spring.rabbitmq.first.username}") String username,
@Value("${spring.rabbitmq.first.password}") String password,
@Value("${spring.rabbitmq.first.virtualhost}") String virtualhost) {
return connectionFactory(host, port, username, password, virtualhost);
}
@Bean(name = "secondConnectionFactory")
public ConnectionFactory secondConnectionFactory(
@Value("${spring.rabbitmq.second.host}") String host,
@Value("${spring.rabbitmq.second.port}") int port,
@Value("${spring.rabbitmq.second.username}") String username,
@Value("${spring.rabbitmq.second.password}") String password,
@Value("${spring.rabbitmq.second.virtualhost}") String virtualhost) {
return connectionFactory(host, port, username, password, virtualhost);
}
// ============================================ 定义RabbitTemplate ====================================================================
@Bean(name = "mainRabbitTemplate")
@Primary
public RabbitTemplate mainRabbitTemplate(@Qualifier("mainConnectionFactory") ConnectionFactory connectionFactory) {
RabbitTemplate mainRabbitTemplate = new RabbitTemplate(connectionFactory);
mainRabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter());
return mainRabbitTemplate;
}
@Bean(name = "secondRabbitTemplate")
public RabbitTemplate secondRabbitTemplate(@Qualifier("secondConnectionFactory") ConnectionFactory connectionFactory) {
RabbitTemplate secondRabbitTemplate = new RabbitTemplate(connectionFactory);
secondRabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter());
return secondRabbitTemplate;
}
// ============================================ 定义监听Listener ====================================================================
@Bean(name = "mainFactory")
@Primary
public SimpleRabbitListenerContainerFactory mainFactory(
SimpleRabbitListenerContainerFactoryConfigurer configurer,
@Qualifier("mainConnectionFactory") ConnectionFactory connectionFactory) {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setMessageConverter(new Jackson2JsonMessageConverter());
configurer.configure(factory, connectionFactory);
return factory;
}
@Bean(name = "secondFactory")
public SimpleRabbitListenerContainerFactory secondFactory(
SimpleRabbitListenerContainerFactoryConfigurer configurer,
@Qualifier("secondConnectionFactory") ConnectionFactory connectionFactory) {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setMessageConverter(new Jackson2JsonMessageConverter());
factory.setConcurrentConsumers(10);
factory.setMaxConcurrentConsumers(20);
factory.setPrefetchCount(1);
configurer.configure(factory, connectionFactory);
return factory;
}
// ============================================ 定义RabbitAdmin====================================================================
@Bean(name = "oneRabbitAdmin")
public RabbitAdmin oneRabbitAdmin(@Qualifier("mainConnectionFactory") ConnectionFactory connectionFactory) {
RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory);
rabbitAdmin.setAutoStartup(true);
return rabbitAdmin;
}
@Bean(name = "twoRabbitAdmin")
public RabbitAdmin twoRabbitAdmin(@Qualifier("secondConnectionFactory") ConnectionFactory connectionFactory) {
RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory);
rabbitAdmin.setAutoStartup(true);
return rabbitAdmin;
}
}
创建队列、交换机并绑定(也可不创建,用管理后台创建)
package com.example.mybatis.config.mq;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
public class QueueConfig {
@Resource(name = "oneRabbitAdmin")
private RabbitAdmin oneRabbitAdmin;
@Resource(name = "twoRabbitAdmin")
private RabbitAdmin twoRabbitAdmin;
@Value("${one.out.queue}")
private String oneOutQueue;
@Value("${one.out.queue}")
private String oneRoutingKey;
@Value("${two.output.queue}")
private String twoOutQueue;
@Value("${two.output.queue}")
private String twoRoutingKey;
@Value("${one.topic.exchange.name}")
private String oneTopicExchange;
@Value("${two.topic.exchange.name}")
private String twoTopicExchange;
@PostConstruct
public void oneRabbitInit() {
//声明交换机
oneRabbitAdmin.declareExchange(new TopicExchange(oneTopicExchange, true, false));
//声明队列
oneRabbitAdmin.declareQueue(new Queue(oneOutQueue, true, false, false));
//绑定队列及交换机
oneRabbitAdmin.declareBinding(BindingBuilder.bind(new Queue(oneOutQueue, true, false, false))
.to(new TopicExchange(oneTopicExchange, true, false))
.with(oneRoutingKey));
}
@PostConstruct
public void twoRabbitInit() {
//声明交换机
twoRabbitAdmin.declareExchange(new TopicExchange(twoTopicExchange, true, false));
//声明队列
twoRabbitAdmin.declareQueue(new Queue(twoOutQueue, true));
//绑定队列及交换机
twoRabbitAdmin.declareBinding(BindingBuilder.bind(new Queue(twoOutQueue, true, false, false))
.to(new TopicExchange(twoTopicExchange, true, false))
.with(twoRoutingKey));
}
}
4. 发送消息
package com.example.mybatis.config.mq;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageBuilder;
import org.springframework.amqp.core.MessageProperties;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@Component
@Slf4j
public class Sender1 {
@Resource(name = "mainRabbitTemplate")
protected RabbitTemplate rabbitTemplate;
public void test() {
this.sendMessage("dhcs-exchange", "DHCS2KF1", "1111111111");
}
/**
* @param exchange 交换机
* @param routingKey 路由
* @param message 消息内容
* @return boolean
* @Description 发送消息
*/
private boolean sendMessage(String exchange, String routingKey, String message) {
long start = System.currentTimeMillis();
try {
Message messageObj = MessageBuilder.withBody(message.getBytes())
.setContentType(MessageProperties.CONTENT_TYPE_JSON)
.build();
rabbitTemplate.convertAndSend(exchange, routingKey, messageObj);
} catch (Exception e) {
log.error("【mq发送失败】", e);
return false;
} finally {
long end = System.currentTimeMillis();
log.info("【mq发送】入参:{},耗时:{}ms", message, (end - start));
}
return true;
}
}
package com.example.mybatis.config.mq;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageBuilder;
import org.springframework.amqp.core.MessageProperties;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@Component
@Slf4j
public class Sender2 {
@Resource(name = "secondRabbitTemplate")
protected RabbitTemplate rabbitTemplate;
public void test() {
this.sendMessage("ssoAccount_exchange", "", "123456789");
}
/**
* @param exchange 交换机
* @param routingKey 路由
* @param message 消息内容
* @return boolean
* @Description 发送消息
*/
private boolean sendMessage(String exchange, String routingKey, String message) {
long start = System.currentTimeMillis();
try {
Message messageObj = MessageBuilder.withBody(message.getBytes())
.setContentType(MessageProperties.CONTENT_TYPE_JSON)
.build();
rabbitTemplate.convertAndSend(exchange, routingKey, messageObj);
} catch (Exception e) {
log.error("【mq发送失败】", e);
return false;
} finally {
long end = System.currentTimeMillis();
log.info("【mq发送】入参:{},耗时:{}ms", message, (end - start));
}
return true;
}
}
5. 接收消息
package com.example.mybatis.config.mq;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class Listener1 {
@RabbitListener(queuesToDeclare = @Queue("DHCS2KF1"), containerFactory = "mainFactory")
@RabbitHandler
public void process(String message) {
log.info("Listener1 接收消息:{} ", message);
try {
// 逻辑处理
System.out.println("Listener1确认消费完成 ..............................");
} catch (Exception e) {
log.error("Listener1确认消费异常", e);
} finally {
log.error("Listener1确认消费:{}", message);
}
}
}
package com.example.mybatis.config.mq;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class Listener2 {
@RabbitListener(queuesToDeclare = @Queue("sso.account.chewu.queue"), containerFactory = "secondFactory")
@RabbitHandler
public void process(String message) {
log.info("Listener2 接收消息:{} ", message);
try {
// 逻辑处理
System.out.println("Listener2确认消费完成 ..............................");
} catch (Exception e) {
log.error("Listener2确认消费异常", e);
} finally {
log.error("Listener2确认消费:{}", message);
}
}
}
不积跬步,无以至千里;不积小流,无以成江海。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具