首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Spring和receiveAndConvert中将jSON有效负载配置为域对象

如何在Spring和receiveAndConvert中将jSON有效负载配置为域对象
EN

Stack Overflow用户
提问于 2015-04-12 17:47:02
回答 2查看 18.5K关注 0票数 7

最近,我对使用Spring的微服务体系结构产生了浓厚的兴趣。我的实现有两个Spring引导应用程序;

应用程序1接收来自RESTful API的请求,将jSON有效负载转换并发送给RabbitMQ queueA

Application 2,订阅了queueA,接收jSON有效负载(域对象用户),并被认为是激活应用程序2中的服务。向用户发送电子邮件。

在我的应用程序2配置中不使用,如何配置转换器将从RabbitMQ接收的jSON有效负载转换为域对象用户。

下面是应用程序2上Spring配置的片段

Application.class

代码语言:javascript
复制
@SpringBootApplication
@EnableRabbit
public class ApplicationInitializer implements CommandLineRunner {

    final static String queueName = "user-registration";

    @Autowired
    RabbitTemplate rabbitTemplate;

    @Autowired
    AnnotationConfigApplicationContext context;

    @Bean
    Queue queue() {
        return new Queue(queueName, false);
    }

    @Bean
    TopicExchange topicExchange() {
        return new TopicExchange("user-registrations");
    }

    @Bean
    Binding binding(Queue queue, TopicExchange exchange) {
        return BindingBuilder.bind(queue).to(exchange).with(queueName);
    }

    @Bean
    SimpleMessageListenerContainer container(ConnectionFactory connectionFactory, MessageListenerAdapter listenerAdapter) {
        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        container.setQueueNames(queueName);
        container.setMessageListener(listenerAdapter);
        return container;
    }

    public static void main(String[] args) {
        SpringApplication.run(ApplicationInitializer.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        System.out.println("Waiting for messages...");
    }

}

TestService.java

代码语言:javascript
复制
@Component
public class TestService {

    /**
     * This test verifies whether this consumer receives message off the user-registration queue
     */
    @RabbitListener(queues = "user-registration")
    public void testReceiveNewUserNotificationMessage(User user) {
        // do something like, convert payload to domain object user and send email to this user
    }

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-11 13:19:50

我也遇到了同样的问题,经过一些研究和测试,我了解到,在SpringBoot中配置您的RabbitMQ接收器的方法不止一种,但重要的是要选择其中一种并坚持这样做。

如果您决定使用注释驱动侦听器端点,那么我从您使用的@Enable兔子和@RabbitListener获得的信息比您发布的配置更适合我。起作用的是:

从org.springframework.amqp.rabbit.annotation.RabbitListenerConfigurer派生您的配置类并重写方法configureRabbitListeners,如下所示:

代码语言:javascript
复制
 @Override
public void configureRabbitListeners(
        RabbitListenerEndpointRegistrar registrar) {
    registrar.setMessageHandlerMethodFactory(myHandlerMethodFactory());
}

并添加一个MessageHandlerFactory:

代码语言:javascript
复制
@Bean
public DefaultMessageHandlerMethodFactory myHandlerMethodFactory() {
    DefaultMessageHandlerMethodFactory factory = new DefaultMessageHandlerMethodFactory();
    factory.setMessageConverter(new MappingJackson2MessageConverter());
    return factory;
}

此外,您还需要定义SimpleRabbitListenerContainerFactory (就像您已经做过的那样),并自动生成相应的ConnectionFactory:

代码语言:javascript
复制
@Autowired
public ConnectionFactory connectionFactory;

@Bean
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory() {
    SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
    factory.setConnectionFactory(connectionFactory);
    factory.setConcurrentConsumers(3);
    factory.setMaxConcurrentConsumers(10);
    return factory;
}

完成配置后,您需要定义Bean,它处理消息并继承@RabbitListerner-注释。对于我来说,我把这个EventResultHandler命名为TestService(您将它命名为TestService):

代码语言:javascript
复制
    @Bean
public EventResultHandler eventResultHandler() {
    return new EventResultHandler();
}

然后在您的EventResultHandler (或TestService)中定义@RabbitListener-方法及其对应的队列和有效载荷(= POJO,其中您的JSON-消息序列化到:

代码语言:javascript
复制
@Component
public class EventResultHandler {

    @RabbitListener(queues=Queues.QUEUE_NAME_PRESENTATION_SERVICE)
    public void handleMessage(@Payload Event event) {
        System.out.println("Event received");
        System.out.println("EventType: " + event.getType().getText());
    }
}

我省略了队列和交换的必要定义和绑定--您可以在一个或另一个Microservice中--或者在RabbitMQ中--手动执行.但你一定要这么做。

票数 12
EN

Stack Overflow用户

发布于 2015-04-12 19:33:19

创建杰克逊消息转换器并使用MessageListenerAdapter#setMessageConverter设置它

代码语言:javascript
复制
@Bean
public MessageConverter jsonMessageConverter() {
    return new Jackson2JsonMessageConverter();
}

MessageListenerAdapter从哪里来?

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29592543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档