Spring Boot配置多个RabbitMQ
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
<version>1.5.2.RELEASE</version>
</dependency>
1.application.yml
spring:
rabbitmq:
hospSync:
host: localhost
port: 5672
username: test
password: test
virtual-host: test
pay:
host: localhost
port: 5672
username: demo
password: demo
virtual-host: demo
rabbitmq:
first:
# 内部生产mq
addresses: localhost:5672
username: guest
password: guest
second:
# 防疫外部消费mq
addresses: localhost:5672
username: guest
password: guest
second:
queueName: queue.device.police.log.1651826493
RabbitMQConfig
import com.unicom.oc.common.aop.RabbitConstants;
import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
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 {
/**
* 数字哨兵内部用的 mq地址 主要功能是生产数据
* @param addresses
* @param username
* @param password
* @return
*/
@Bean(name="firstConnectionFactory")
@Primary
public ConnectionFactory firstConnectionFactory(
@Value("${spring.rabbitmq.first.addresses}") String addresses,
@Value("${spring.rabbitmq.first.username}") String username,
@Value("${spring.rabbitmq.first.password}") String password
){
CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
connectionFactory.setAddresses(addresses);
connectionFactory.setUsername(username);
connectionFactory.setPassword(password);
return connectionFactory;
}
@Bean(name="firstRabbitTemplate")
@Primary
public RabbitTemplate firstRabbitTemplate(
@Qualifier("firstConnectionFactory") ConnectionFactory connectionFactory
){
RabbitTemplate firstRabbitTemplate = new RabbitTemplate(connectionFactory);
firstRabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter());
return firstRabbitTemplate;
}
@Bean(name="firstFactory")
public SimpleRabbitListenerContainerFactory firstFactory(
SimpleRabbitListenerContainerFactoryConfigurer configurer,
@Qualifier("firstConnectionFactory") ConnectionFactory connectionFactory
) {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
configurer.configure(factory, connectionFactory);
factory.setMessageConverter(new Jackson2JsonMessageConverter());
return factory;
}
/**
* 防疫日志用的 mq地址 主要功能是消费外部数据落库
* @param addresses
* @param username
* @param password
* @return
*/
@Bean(name="secondConnectionFactory")
public ConnectionFactory secondConnectionFactory(
@Value("${spring.rabbitmq.second.addresses}") String addresses,
@Value("${spring.rabbitmq.second.username}") String username,
@Value("${spring.rabbitmq.second.password}") String password
){
CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
connectionFactory.setAddresses(addresses);
connectionFactory.setUsername(username);
connectionFactory.setPassword(password);
return connectionFactory;
}
@Bean(name="secondRabbitTemplate")
public RabbitTemplate secondRabbitTemplate(
@Qualifier("secondConnectionFactory") ConnectionFactory connectionFactory
){
RabbitTemplate secondRabbitTemplate = new RabbitTemplate(connectionFactory);
return secondRabbitTemplate;
}
@Bean(name="secondFactory")
public SimpleRabbitListenerContainerFactory secondFactory(
SimpleRabbitListenerContainerFactoryConfigurer configurer,
@Qualifier("secondConnectionFactory") ConnectionFactory connectionFactory
) {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
configurer.configure(factory, connectionFactory);
return factory;
}
@Bean(name="firstFactory")
public MessageConverter messageConverter() {
return new Jackson2JsonMessageConverter();
}
/**
*<p>Title: messageQueue</p>
*<p>Description: 队列</p>
* @return
*/
@Bean(name="firstFactory")
public Queue messageQueue() {
return new Queue(RabbitConstants.MESSAGE_QUEUE, true);
}
/**
*<p>Title: directExchange</p>
*<p>Description: 路由模式</p>
* @return
*/
@Bean(name="firstFactory")
public DirectExchange directExchange() {
return new DirectExchange(RabbitConstants.DIRECT_EXCHANGE);
}
/**
*<p>Title: bindingMessage</p>
*<p>Description: 使用directExchange交换机绑定短信队列</p>
* @return
*/
@Bean(name="firstFactory")
public Binding directExchangeBindingMessage() {
return BindingBuilder.bind(messageQueue()).to(directExchange()).with(RabbitConstants.MESSAGE_ROUTING_KEY);
}
}
发送消息
@Resource(name = "mainRabbitTemplate")
protected RabbitTemplate rabbitTemplate;
public MessageProvider(RabbitTemplate rabbitTemplate) {
this.rabbitTemplate = rabbitTemplate;
this.rabbitTemplate.setMandatory(true);
this.rabbitTemplate.setConfirmCallback(this);
}
public void sendMessage(RealBusBaseLineDTO realBusBaseLineDTO) {
if (realBusBaseLineDTO != null) {
String msg = JSON.toJSONString(realBusBaseLineDTO, SerializerFeature.DisableCircularReferenceDetect);
rabbitTemplate.convertAndSend(QueueEnum.MESSAGE_REALBUS_QUEUE.getExchange(), QueueEnum.MESSAGE_REALBUS_QUEUE.getRouteKey(), msg);
} else {
log.warn("消息内容为空!!!!!");
}
}
消费消息
@Resource
private IRealBusDataService realBusDataService;
@Value("${network.bus.isReadActiveQueue}")
private Boolean isReadActiveQueue;
@RabbitListener(queues = QueueContent.MESSAGE_REALBUS_DATA_QUEUE_NAME, containerFactory = "secondFactory")
@RabbitHandler
public void processRealBusDataQueue(String msg, Channel channel, Message message) throws IOException {
log.warn("processRealBusDataQueue:{} ", msg);
try {
String bodyMessage = new String(msg);
// 逻辑处理
} catch (Exception e) {
log.error("确认消费异常", e);
}
}
}