RabbitTemplate封装疑惑
来源:3-7 RabbitTemplate池化封装
Panda_io
2020-12-01 11:04:49
public RabbitTemplate getTemplate(Message message) throws MessageRunTimeException {
Preconditions.checkNotNull(message);
String topic = message.getTopic();
RabbitTemplate rabbitTemplate = rabbitMap.get(topic);
if(rabbitTemplate != null){
return rabbitTemplate;
}
log.info("#RabbitTemplateContainer.getTemplate# topic:{} is not exists,create one",topic);
RabbitTemplate newTemplate = new RabbitTemplate(connectionFactory);
newTemplate.setExchange(topic);
newTemplate.setRoutingKey(message.getRoutingKey());
newTemplate.setRetryTemplate(new RetryTemplate());
// 对于message序列化方式
// newTemplate.setMessageConverter();
String messageType = message.getMessageType();
if(MessageType.RAPID.equals(messageType)){
newTemplate.setConfirmCallback(this);
}
rabbitMap.putIfAbsent("topic",newTemplate);
return rabbitMap.get(topic);
}
老师您这样封装,第一次发送消息的时候会创建一个template这个template有固定的topic和routingkey,当下一次相同topic但是routingKey不同的message进来获取到一个template,然后我们还得再获取后重新设置routingKey 我们何不把设置路由这一步直接放到获取template的逻辑里呢?这样我们就不用在kernel里再传入topic和routingKey了
/**
* 发送消息的核心方法,使用异步线程池进行发送
* @param message
*/
private void sendKernel(Message message) {
AsyncBaseQueue.submit(()->{
CorrelationData correlationData = new CorrelationData(String.format("%s#%s",
message.getMessageId(),
System.currentTimeMillis()));
String topic = message.getTopic();
String routingKey = message.getRoutingKey();
RabbitTemplate rabbitTemplate = rabbitTemplateContainer.getTemplate(message);
//老师这里的topic是不是不用传了呀,毕竟在template就设置了
rabbitTemplate.convertAndSend(topic,routingKey,message,correlationData);
log.info("#RabbitBrokerImpl.sendKernel# send to rabbitmq, messageId: {}",message.getMessageId());
});
}
1回答
嗯,这样做也可以,我只是提供一个脚手架,小伙伴可以按照自己的理解来修改
相似问题
回答 1
回答 1