栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Spring Boot Rabbitmq MappingJackson2MessageConverter自定义对象转换

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring Boot Rabbitmq MappingJackson2MessageConverter自定义对象转换

好的,我终于可以工作了。

Spring使用 PayloadArgumentResolver 提取,转换并将转换后的消息设置为以 @RabbitListener
注释的方法参数。我们需要以某种方式将 mappingJackson2MessageConverter 设置为此对象。

因此,在CONSUMER应用程序中,我们需要实现 RabbitListenerConfigurer 。通过重写
configureRabbitListeners(RabbitListenerEndpointRegistrar registrar),
我们可以将自定义 DefaultMessageHandlerMethodFactory
设置为该工厂,从而设置消息转换器,并且工厂将使用正确的转换来创建 PaypayArgumentResolver

这是代码片段,我还更新了git project。

ConsumerApplication.java

package demo.consumer;import org.springframework.amqp.rabbit.annotation.EnableRabbit;import org.springframework.amqp.rabbit.annotation.RabbitListener;import org.springframework.amqp.rabbit.annotation.RabbitListenerConfigurer;import org.springframework.amqp.rabbit.listener.RabbitListenerEndpointRegistrar;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.context.annotation.Bean;import org.springframework.messaging.converter.MappingJackson2MessageConverter;import org.springframework.messaging.handler.annotation.support.DefaultMessageHandlerMethodFactory;import org.springframework.stereotype.Service;@SpringBootApplication@EnableRabbitpublic class ConsumerApplication implements RabbitListenerConfigurer {    public static void main(String[] args) {        SpringApplication.run(ConsumerApplication.class, args);    }    @Bean    public MappingJackson2MessageConverter jackson2Converter() {        MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();        return converter;    }    @Bean    public DefaultMessageHandlerMethodFactory myHandlerMethodFactory() {        DefaultMessageHandlerMethodFactory factory = new DefaultMessageHandlerMethodFactory();        factory.setMessageConverter(jackson2Converter());        return factory;    }    @Override    public void configureRabbitListeners(RabbitListenerEndpointRegistrar registrar) {        registrar.setMessageHandlerMethodFactory(myHandlerMethodFactory());    }    @Autowired    private Receiver receiver;}@Serviceclass Receiver {    @RabbitListener(queues = "queue")    public void receiveMessage(Foo foo) {        System.out.println("Received <" + foo.name + ">");    }    @RabbitListener(queues = "queue")    public void receiveMessage(Bar bar) {        System.out.println("Received <" + bar.age + ">");    }}class Foo {    public String name;}class Bar {    public int age;}

因此,如果您运行Producer微服务,它将在队列中添加2条消息。一个代表Foo对象,另一个代表Bar对象。通过运行使用者微服务,您将看到两者都被
Receiver 类中的相应方法所消耗。


更新的问题:

我认为从我这边排队有一个概念上的问题。我想实现的目标无法通过声明2个用 @RabbitListener
注释的方法指向同一队列来实现。上面的解决方案无法正常工作。如果您发送给rabbitmq,比如说6条Foo消息和3条Bar消息,则带有Foo参数的侦听器将不会收到6次。似乎侦听器是并行调用的,因此无法根据方法参数类型来区分要调用的侦听器。我的解决方案(而且我不确定这是否是最好的方法,在这里我可以提出建议)是为每个实体创建一个队列。所以现在,我有了
queue.barqueue.foo ,并更新 @RabbitListener(queues =“ queue.foo”)
再一次,我更新了代码,您可以在git仓库中检出代码。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/615484.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号