RabbitMQ 多源配置,以推和拉不同数据源为例。
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.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.Conditional;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
/**
* @Author: ZhangHao
* @Description: RabbitMQ配置
* @Date: 2022/8/11 11:27 AM
* @Version: 1.0
*/
@Configuration
public class RabbitMQConfig {
@Conditional({RabbitMQPullCondition.class})
@Bean(name = "pullConnectionFactory")
@Primary
public ConnectionFactory pullConnectionFactory(@Value("${spring.rabbitmq.pull.host}") String host, @Value("${spring.rabbitmq.pull.port}") Integer port, @Value("${spring.rabbitmq.pull.username}") String username, @Value("${spring.rabbitmq.pull.password}") String password, @Value("${spring.rabbitmq.pull.virtual-host}") String virtualHost) {
return getConnectionFactory(host, port, username, password, virtualHost);
}
@Conditional({RabbitMQPushCondition.class})
@Bean(name = "pushConnectionFactory")
public ConnectionFactory pushConnectionFactory(@Value("${spring.rabbitmq.push.host}") String host, @Value("${spring.rabbitmq.push.port}") Integer port, @Value("${spring.rabbitmq.push.username}") String username, @Value("${spring.rabbitmq.push.password}") String password, @Value("${spring.rabbitmq.push.virtual-host}") String virtualHost) {
return getConnectionFactory(host, port, username, password, virtualHost);
}
@Conditional({RabbitMQPullCondition.class})
@Bean(name = "pullRabbitTemplate")
@Primary
public RabbitTemplate pullRabbitTemplate(@Qualifier("pullConnectionFactory") ConnectionFactory connectionFactory) {
return new RabbitTemplate(connectionFactory);
}
@Conditional({RabbitMQPushCondition.class})
@Bean(name = "pushRabbitTemplate")
public RabbitTemplate pushRabbitTemplate(@Qualifier("pushConnectionFactory") ConnectionFactory connectionFactory) {
return new RabbitTemplate(connectionFactory);
}
@Conditional({RabbitMQPullCondition.class})
@Bean(name = "pullContainerFactory")
public SimpleRabbitListenerContainerFactory pullContainerFactory(SimpleRabbitListenerContainerFactoryConfigurer configurer, @Qualifier("pullConnectionFactory") ConnectionFactory connectionFactory) {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
configurer.configure(factory, connectionFactory);
return factory;
}
@Conditional({RabbitMQPushCondition.class})
@Bean(name = "pushContainerFactory")
public SimpleRabbitListenerContainerFactory pushContainerFactory(SimpleRabbitListenerContainerFactoryConfigurer configurer, @Qualifier("pushConnectionFactory") ConnectionFactory connectionFactory) {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
configurer.configure(factory, connectionFactory);
return factory;
}
private ConnectionFactory getConnectionFactory(String host, Integer 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;
}
}
spring:
rabbitmq:
pull:
host:
port:
username:
password:
virtual-host: /
queue:
busPosition:
push:
host:
port:
username:
password:
virtual-host: /
exchange:
routingKey:
@Conditional({RabbitMQPullCondition.class})
@Component
@Log4j2
public class BusPositionListener {
@Autowired
private IBusPositionService Service;
/**
* 验证是否能消费到消息,每次重启后验证,只验证一次,防止日志量过大,默认未验证
*/
private Boolean isNotVerify = true;
@RabbitListener(queues = "${spring.rabbitmq.pull.queue.busPosition}", containerFactory = "pullContainerFactory")
public void deal(Message message) {
if(isNotVerify) {
log.info("可以消费到消息,message:{}", message);
isNotVerify = false;
}
}
}
@Resource(name = "pushRabbitTemplate")
private RabbitTemplate pushDataLakeRabbitTemplate;
private void sendMessage(PushMessage pushMessage) {
log.info("dataLake sendMQ, pushMessage:{}", pushMessage);
pushDataLakeRabbitTemplate.convertAndSend(exchange, routingKey, JSON.toJSONString(pushMessage));
}