我正在研究一个场景,其中命令和查询服务是分离的节点(弹簧启动)。我将 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 格式。
我的聚合接收命令并触发事件,这些都正确存储在 mysql-eventstore 中。在这里,事件采用 xml 格式。
现在是棘手的部分。我使用 axon-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-repository-service 永远不会被调用。
我担心我为rabbit配置的json转换器和axon中的xml事件处理会干扰......还是我走错了路?如何通过rabbit正确分离命令和查询服务,eventProcessor名称有什么用?我使用了处理事件流的spring bean的bean名称......