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回答

阿神

2020-12-01

嗯,这样做也可以,我只是提供一个脚手架,小伙伴可以按照自己的理解来修改

0
handa_io
hp>谢谢老师,听了老师这门课,只有两个字可以表达,那就是牛批,真的给我们太多启发了,非常感谢!老师那门专门讲RabbitMQ的课我也买了,这次又有新收获!

h020-12-01
共1条回复

Java架构师-技术专家

千万级电商项目从0到100全过程,覆盖Java程序员不同成长阶段的核心问题与解决方案

2672 学习 · 5839 问题

查看课程