axon 3通过rabbitmq:json与xml分开的命令和查询服务

时间:2017-06-19 17:42:48

标签: spring-boot rabbitmq axon

我正在开发一个场景,其中命令和查询服务是分离的节点(spring boot)。 我将RabbitTemplate配置为使用Jackson进行JSON序列化:

@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格式。

My Aggregate接收命令并触发事件,这些事件正确存储在mysql-eventstore中。这里的事件是xml格式。

现在是棘手的部分。我使用axon-springboot通过属性再次将事件发送到兔子队列:

axon.amqp.exchange: my-event-exchange

同样,这有效,我可以检查队列并查看事件(以xml格式)。

在Queue-Service上,我想接收事件并生成内存中的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-repository-service。

我担心我为兔子配置的json转换器和轴突中的xml事件处理会干扰......或者我是否在错误的轨道上?如何正确地通过兔子分离命令和查询服务,什么是eventProcessor名称适合?我使用处理事件流的spring bean的bean名称...

1 个答案:

答案 0 :(得分:0)

看起来配置中的两种方法相互冲突。自动配置使用缺少特定类型的bean来定义默认值。但是,如果您定义了一个期望类型的bean(即使是用于不同目的),那么也会使用该bean。

Axon使用Spring的AMQP AutoConfiguration来读取消息。如果您指定要以特定方式转换消息,那么Axon也将间接使用它。

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

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

希望这有帮助。