写在前面
本文看下如何配置rabbitmq多数据源(生产者和消费者)。
1:正文
在springboot环境下,基于自动配置,只配置一个是很简答的,像这样就行:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
spring:
rabbitmq:
host: 10.150.30.43
port: 5672
username: dixxxg
password: dixxx
virtual-host: dialog_vhost
connection-timeout: 15000
listener:
simple:
acknowledge-mode: auto # 自动ack
retry:
enabled: true
max-attempts: 5
max-interval: 60000 # 重试最大间隔时间
initial-interval: 5000 # 重试初始间隔时间
multiplier: 2 # 间隔时间乘子,间隔时间*乘子=下一次的间隔时间,最大不能超过设置的最大间隔时间
这样就会自动注入创建org.springframework.amqp.rabbit.core.RabbitTemplate类,但是如果需要第二个,就稍微费点功夫了,但也不复杂,首先当然也是配置要连接的mq地址(这个就没有格式要求了,自己能取到就行)。
1.1:多数据源消费者
配置文件:
nonlivingcheck:
rabbitmq:
host: ***
port: 5672
username: di***g
password: Yan****123
connection-timeout: 15000
virtual-host: dialog_vhost
接着如下方式代码手动配置方式绑定交换机,创建队列等:
java
@Bean
public SimpleMessageListenerContainer orderQueueListenerContainer(@Value("${nonlivingcheck.rabbitmq.host}") String host,
@Value("${nonlivingcheck.rabbitmq.port}") int port,
@Value("${nonlivingcheck.rabbitmq.username}") String username,
@Value("${nonlivingcheck.rabbitmq.password}") String password,
@Value("${nonlivingcheck.rabbitmq.virtual-host}") String virtualHost) {
log.info("create nonliving check configuration begin");
CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
connectionFactory.setHost(host);
connectionFactory.setPort(port);
connectionFactory.setUsername(username);
connectionFactory.setPassword(password);
connectionFactory.setVirtualHost(virtualHost);
// 2. 创建 RabbitAdmin 用于声明组件
RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory);
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
// 1:定义队列和交换机,并声明
TopicExchange topicExchange = new TopicExchange("asv.exchange", true, false);
rabbitAdmin.declareExchange(topicExchange);
Queue nonlivingQueue = new Queue(NONLIVING_QUEUE_NAME, true, false, true);
log.info("automatically create queue: [{}] in vhost: [{}], exchanger: [asv.exchange]", NONLIVING_QUEUE_NAME, virtualHost);
rabbitAdmin.declareQueue(nonlivingQueue);
// 队列绑定交换机,并定义routingkey
Binding binding = BindingBuilder.bind(nonlivingQueue)
.to(topicExchange)
// .with("asv.results"); // 精确匹配 user.update
.with("asv.#");
rabbitAdmin.declareBinding(binding);
// 3:关联到container,间接关联到mq connect信息
container.addQueues(nonlivingQueue);
container.setMessageListener(new MessageListenerAdapter(topicMessageHandler) {
{
setDefaultListenerMethod("handleMessage");
setMessageConverter(jsonMessageConverter());
}
});
container.setConcurrentConsumers(3);
container.setMaxConcurrentConsumers(5);
log.info("congratulation!!! you create nonliving check configuration suc, what a great job done!!!");
return container;
}
代码:
java
container.setMessageListener(new MessageListenerAdapter(topicMessageHandler) {
{
setDefaultListenerMethod("handleMessage");
setMessageConverter(jsonMessageConverter());
}
});
配置了消息处理类以及对应的方法,这样就会绑定交换机和创建队列了,消息处理器如下:
java
@Component
public class NonlivingMessageHandler {
/**
* 处理用户相关消息
* 路由键匹配:user.*
*/
public void handleMessage(LinkedHashMap message) {
// 消息处理逻辑
}
}
这里的消息入参不一定是LinkedHashMap,因为我这里消费的消息是json格式的,如果是你不是可能需要改这里。
1.2:多数据源生产者
相比对数据源消费者,这种方式要简单的多了,首先定义配置文件:
outcallrobot:
rabbitmq:
host: ***
port: 5672
username: ***
password: ***
virtual-host: osc
代码:
java
@Bean(name = "outcallRobotRabbitTemplate")
public RabbitTemplate firstRabbitTemplate(@Value("${outcallrobot.rabbitmq.host}") String host,
@Value("${outcallrobot.rabbitmq.port}") int port,
@Value("${outcallrobot.rabbitmq.username}") String username,
@Value("${outcallrobot.rabbitmq.password}") String password,
@Value("${outcallrobot.rabbitmq.virtual-host}") String virtualHost) {
CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
connectionFactory.setHost(host);
connectionFactory.setPort(port);
connectionFactory.setUsername(username);
connectionFactory.setPassword(password);
connectionFactory.setVirtualHost(virtualHost);
// return connectionFactory;
return new RabbitTemplate(connectionFactory);
}
使用:
java
@Resource(name = "outcallRobotRabbitTemplate")
// @Resource
private RabbitTemplate robotRabbitTemplate;