在我们的日常工作中,大部分情况下,我们的服务一般只需要连接某一个存放消息的rabbitMQ服务器。但是,现在多用微服务和分布式的开发部署模式,一个服务连接多个rabbitMQ服务器的需求也难以避免。最近刚好遇到,并实现,发出步骤,避免大家走弯路。
首先是yml或者propertes文件中的配置信息:
spring.rabbitmq.first.host = XXXX
spring.rabbitmq.first.port = XXXX
spring.rabbitmq.first.username = XXX
spring.rabbitmq.first.password = XXXX
spring.rabbitmq.second.host = XXXX
spring.rabbitmq.second.port = XXXX
spring.rabbitmq.second.username = XXXX
spring.rabbitmq.second.password = XXXX
然后是connectionFactory
如果连接单个rabbitMQ服务器,可以直接使用amqp官方jar包,不用手写这个类。但是连接两个rabbitMQ服务器就需要手写这个构建连接类
public class connectionFactory {
/*
定义连接,rabbitMQ
*/
@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) {
return connectionFactory(host, port, username, password);
}
/*
定义连接
*/
@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) {
return connectionFactory(host, port, username, password);
}
/*
定义连接
*/
public CachingConnectionFactory connectionFactory(String host, int port, String username, String password) {
CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
connectionFactory.setHost(host);
connectionFactory.setPort(port);
connectionFactory.setUsername(username);
connectionFactory.setPassword(password);
// connectionFactory.setVirtualHost(virtual_host);
return connectionFactory;
}
@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);
return secondRabbitTemplate;
}
@Bean(name = "mainFactory")
@Primary
public SimpleRabbitListenerContainerFactory myFactory(
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.setConcurrentConsumers(10);
factory.setMaxConcurrentConsumers(20);
factory.setPrefetchCount(1);
configurer.configure(factory, connectionFactory);
return factory;
}
}
监听消息队列:
@RabbitListener(queues = “${mq.clock}”)
可监听配置为@Primary的消息服务器上的队列
@RabbitListener(queues = “${mq.parsing_face_picture_iot}”,containerFactory = “secondFactory”)
通过containerFactory 属性指定名称可监听其他服务器上的消息队列。