springboot2.x请移步此处
找这个问题的,估计很多人都是找的资料都是一样的,多个抄袭的网站都是下图的答案。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6hBeZ7xg-1597047875284)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20200810104549007.png)]](https://i-blog.csdnimg.cn/blog_migrate/03cc3dd59318e1a48c4a1b3fcd5bfa22.png)
但实际操作就发现,这个代码是不全的,比如:this.buildMessage(content,correlationId.getId()),这个方法就是没附上的。直接黑人问号。
先下个结论:按照该网站的做法,还是无法解决问题
请注意:后续版本已修复部分bug,使用起来方便了很多
本文因为建立在springboot 1.x的版本上,很久没更新了。(笔者都没发现,还认真了debug了好久) 。
本文不作删除,就作为自己不搞清楚版本,还一头debug的教训吧。
当然了,springboot从1.x升级到2.x也是会有很多问题的。
如果在不升级springboot的情况下,本文还是有参考价值的
再次提醒,springboot 2.x 版本以上,请移步另一篇文章:点击跳转
本文环境:
springboot 1.5.8.RELEASE + amqp-client 4.0.3.jar
本文分两部分,第一部分先直接给代码实现,第二部分进行原理解析。
实现代码
交换机、路由那些就自己改吧,附上全部代码很累赘,只说关键点
- 配置RabbitTemplate (这步同网站的操作)
@Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) //这个不知道有没有用,测试时是有无都可以,多线程无测试,保留
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
rabbitTemplate.setMessagePropertiesConverter(defaultMessagePropertiesConverter());
return rabbitTemplate;
}
@Bean
public MessagePropertiesConverter defaultMessagePropertiesConverter() {
DefaultMessagePropertiesConverter messagePropertiesConverter =
new DefaultMessagePropertiesConverter();
messagePropertiesConverter
.setCorrelationIdPolicy(DefaultMessagePropertiesConverter.CorrelationIdPolicy.STRING);
return messagePropertiesConverter;
}
-
生产者发送消息前,通过
CorrelationAwareMessagePostProcessor设置MessageProperties,绑定correlationId(这步的Processor除了在发送时设置,还可以全局设置,原理会提及)
public void sendMiaoshaMessage(String msg) { CorrelationData correlationData = new CorrelationData(); String uuid = UUID.randomUUID().toString(); correlationData.setId(uuid); System.out.println("分配ID:" + correlationData.getId()); MessagePostProcessor messagePostProcessor = new CorrelationAwareMessagePostProcessor() { @Override public Message postProcessMessage(Message message, Correlation correlation) { MessageProperties messageProperties = message.getMessageProperties(); if(correlation instanceof CorrelationData){ String correlationId = ((CorrelationData) correlation).getId(); messageProperties.setCorrelationIdString(correlationId); } // 持久化的设置也是在此处,但与本文无关,因此没有附上 return message; } @Override public Message postProcessMessage(Message message) throws AmqpException { return message; } }; System.out.println("发送消息"); rabbitTemplate.convertAndSend(MQConfig.MIAOSHA_EXCHANGE, MQConfig.MIAOSHA_ROUTING_KEY, msg, messagePostProcessor, correlationData); } -
消费者接收消息:
@RabbitListener(queues = MQConfig.MIAOSHA_QUEUE) @RabbitHandler public void receive(String msg, Channel channel, Message messages){ System

最低0.47元/天 解锁文章
3943

被折叠的 条评论
为什么被折叠?



