2017-06-19 6 views
0

Je travaille sur un scénario, où les services de commande et de requête sont des nœuds séparés (démarrage par ressort). configuré à l'RabbitTemplate utiliser Jackson pour la sérialisation JSON:axon 3 service de requête et de commande séparé via rabbitmq: json vs 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(); 
} 

Cela fonctionne, quand j'envoie la commande au service de commande, je peux vérifier le format JSON correct dans la file d'attente RabbitMQ.

Mon Aggregate reçoit les commandes et déclenche les événements, ceux-ci sont correctement stockés dans un mysql-eventstore. Ici, les événements sont au format XML.

Maintenant vient la partie difficile. J'utilise axone-springboot d'envoyer à nouveau les événements à une file d'attente de lapin via la propriété:

axon.amqp.exchange: my-event-exchange 

Encore une fois, cela fonctionne, je peux vérifier la file d'attente et voir l'événement (en format xml).

Sur la file d'attente-service, je veux recevoir les événements et produire une représentation en mémoire h2 ... J'utilise:

@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); 
    } 

comme indiqué dans la documentation.

Mais, alors que je vois "l'événement reçu" log, je reçois un

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] 

avertissement et mon h2-dépôt-service est jamais appelé.

Je crains que le convertisseur json que j'ai configuré pour lapin et la gestion des événements xml dans axon interférer ... ou suis-je sur la mauvaise voie? Comment séparer correctement le service de commande et de requête via lapin, et à quoi sert le nom du programme eventProcessor? J'ai utilisé le nom de haricot du haricot de printemps qui gère le flux d'événements ...

Répondre

0

Il semble que les deux approches dans votre configuration sont en conflit les unes avec les autres. L'autoconfiguration utilise l'absence de types spécifiques de beans pour définir les valeurs par défaut. Cependant, si vous définissez un bean (même s'il est destiné à un but différent) d'un type attendu, ce bean est utilisé.

Axon utilise l'AutoConfiguration AMQP de Spring pour lire les messages. Si vous spécifiez que vous souhaitez convertir des messages d'une manière spécifique, Axon utilisera indirectement cela également.

Une solution de contournement pourrait être de ne pas définir le Jackson2JsonMessageConverter en tant que bean. Je doute que le MessageListenerContainer (que Spring utilise pour invoquer la méthode @RabbitListener) utilise le RabbitTemplate, mais je suis presque certain qu'il utilisera n'importe quel MessageConverter défini dans votre contexte d'application.

Vous pouvez également définir les composants nécessaires à la lecture explicite des messages à partir d'AMQP, au lieu de s'appuyer sur la configuration automatique. Dans ce cas, vous pouvez configurer un (extra) SimpleMessageListenerContainerFactory et affecter ce conteneur à votre annotation @RabbitListener (containerFactory = "").

Espérons que cela aide.

+0

Merci, allard. Je vais y jeter un coup d'oeil. –

+0

@JanGalinski Avez-vous trouvé une solution? J'ai le même problème. Quelle est la configuration du nouveau SimpleMessageListenerContainerFactory? THX –