专业网站有哪些平台,海南省城乡和建设厅网站,用google翻译做多语言网站,seo网站优化推广怎么做theme: nico
你们好#xff0c;我是金金金。 场景 购物车里面有5个商品#xff0c;用户勾选了并且提交订单了#xff0c;此时需要删除购物车对应勾选的商品#xff0c;mq的话涉及到传递用户信息~因为删除对应的购物车商品是需要传递用户信息来知晓对应用户的 生产者 消费者…
theme: nico
你们好我是金金金。 场景 购物车里面有5个商品用户勾选了并且提交订单了此时需要删除购物车对应勾选的商品mq的话涉及到传递用户信息~因为删除对应的购物车商品是需要传递用户信息来知晓对应用户的 生产者 消费者
排查 看报错很明显就是参数不支持点击convertAndSend方法可以看到第四个参数是MessagePostProcessor类型我们传递的类型不对当然报错了 我们在看一下MessagePostProcessor是啥 这个函数是一个函数式接口用于处理消息。其中postProcessMessage(Message var1) 是一个必需的方法用于对消息进行处理。另外还提供了两个默认方法 postProcessMessage(Message message, Correlation correlation) 和 postProcessMessage(Message message, Correlation correlation, String exchange, String routingKey)用于在处理消息时提供额外的参数但最终都会调用 postProcessMessage(Message var1) 方法进行实际的消息处理。 解决 生产者第四个参数new MessagePostProcessor接口重写postProcessMessage方法 消费者使用Message接收数据
测试 可以看到用户id已经拿到了说明用户信息传递成功
优化
监听器逻辑优化
为了避免在每个Listener都加同样的setUserId的方法考虑在公用模块里加。因为无论哪个listener接受都需要经过消息转换器因此考虑在启动类里面里重写消息转化器的fromMessage方法。 监听器里面的set逻辑就不用写了还是很方便的
优化消息转换器
现在我在生产者和消费者的启动类上都写了消息转换器意味着消息咱们使用的JSON消息转换器 需要在每个模块的启动类里面都定义一个方法并且注入到spring容器当中才能使用假设微服务有十个模块 都需要难不成咱们写十遍吗太繁琐了咱们可以把这个bean放在一个全局模块当中这个全局模块配置文件里面把定义的方法注入到spring容器里面就可以需要使用的模块引入这个全局模块依赖坐标就行了。
咱们把逻辑放在一个公共模块的配置文件里面 我的公共模块资源里面有一个spring.factories文件 意味着Spring Boot在启动时会扫描并激活这些配置类MyBatisConfig、JsonConfig、MvcConfig。如果这些配置类中包含Bean注解的方法那么这些方法将会被调用它们的返回值会被注册到Spring容器中作为一个Bean从而可以被其他组件依赖注入和使用。 需要使用的服务只要导入了common这个公共模块的依赖即可相当于也就有了公共模块里面的bean 记得公共模块引入如下依赖
总结 生产者使用MessagePostProcessor在消息发送前设置消息属性头消费者使用Message参数接收即可 编写有误还请大佬指正万分感谢。