2017-06-19 27 views
0

我正在研究一个场景,其中命令和查询服务是分开的节点(弹簧引导)。 我配置为使用杰克逊JSON序列化的RabbitTemplate:axon 3通过rabbitmq:json与xml分离的命令和查询服务

@Bean 
RabbitTemplate rabbitTemplate(final ConnectionFactory connectionFactory, Jackson2JsonMessageConverter converter) { 
    final RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory); 
    rabbitTemplate.setMessageConverter(converter); 
    return rabbitTemplate; 
} 

@Bean 
Jackson2JsonMessageConverter producerJackson2MessageConverter() { 
    return new Jackson2JsonMessageConverter(); 
} 

这工作,当我将命令发送到该命令的服务,我可以在RabbitMQ的队列检查正确的JSON格式。

我的骨料接收的命令和事件触发,这些被正确地存储在MySQL-eventstore。这里,事件是以xml格式。

现在出现棘手的部分。我用轴突springboot通过财产重新发送事件给兔队列:

axon.amqp.exchange: my-event-exchange 

同样,这个工作,我可以检查队列,并查看活动(以XML格式)。

在队列服务,我想收到的事件,并在内存H2表示产生...我用:

@Bean 
public SpringAMQPMessageSource myMessageSource(Serializer serializer, EventHandlingConfiguration ehConfig) { 
    return new SpringAMQPMessageSource(serializer) { 
     @RabbitListener(queues = "my-event-queue") 
     @Override 
     public void onMessage(Message message, Channel channel) throws Exception { 
      log.info("receiving event: {}#{}", message, channel); 
      super.onMessage(message, channel); 
     } 
    }; 
    } 

    @Autowired 
    public void configure(EventHandlingConfiguration ehConfig, SpringAMQPMessageSource myMessageSource) { 
    ehConfig.registerSubscribingEventProcessor(
      "taskQueryObjectUpdater", c -> myMessageSource); 
    } 

如文档中说明。

但是,当我看到“接收事件”日志,我得到一个

2017-06-16 15:17:38.168 WARN 69212 --- [cTaskExecutor-1] o.s.a.s.c.Jackson2JsonMessageConverter : Could not convert incoming message with content-type [null] 

警告和我的H2-库服务永远不会被调用。

我担心,JSON转换器我配置了兔子和XML事件轴突处理干扰......还是我在错误的轨道上?如何正确地分离通过rabbit的命令和查询服务,以及eventProcessor名称的好处是什么?我使用的弹簧豆处理eventstream的bean的名字......

回答

0

它看起来像在配置这两种方法都与海誓山盟冲突。自动配置使用缺少特定类型的bean来定义默认值。但是,如果您为预期类型定义一个bean(即使用于不同目的),那么将使用该bean。

轴突使用Spring的AMQP自动配置来阅读邮件。如果您指定要以特定方式转换消息,则Axon也会间接使用该消息。

一种解决方法可能是没有定义Jackson2JsonMessageConverter作为一个bean。我怀疑MessageListenerContainer(Spring用来调用@RabbitListener方法)使用RabbitTemplate,但我几乎肯定它会使用应用程序上下文中定义的任何MessageConverter。

或者,您也可以定义为需要从AMQP读取消息明确的组件,上而不是依赖于自动配置。在这种情况下,您可以配置(额外的)SimpleMessageListenerContainerFactory,并将该容器分配给@RabbitListener(containerFactory =“”)注释。

希望这会有所帮助。

+0

谢谢,allard。我会看看它。 –

+0

@JanGalinski您是否找到解决方案?我也有同样的问题。新的SimpleMessageListenerContainerFactory的配置是什么?谢谢 –