Axonframework, comment utiliser MessageDispatchInterceptor avec réactif référentiel

0

La question

J'ai lu l'ensemble basé sur la cohérence de validation blog et je tiens à valider par le biais d'un envoi de l'intercepteur. J'ai suivi l'exemple, mais j'utilise le réactif de dépôt et ça ne fonctionne pas vraiment pour moi. J'ai essayé les deux bloc et de ne pas bloquer. avec le bloc, il déclenche une erreur, mais sans bloquer il n'a pas d'exécuter quoi que ce soit. voici mon code.

class SubnetCommandInterceptor : MessageDispatchInterceptor<CommandMessage<*>> {

  @Autowired
  private lateinit var privateNetworkRepository: PrivateNetworkRepository

  override fun handle(messages: List<CommandMessage<*>?>): BiFunction<Int, CommandMessage<*>, CommandMessage<*>> {
    return BiFunction<Int, CommandMessage<*>, CommandMessage<*>> { index: Int?, command: CommandMessage<*> ->
      if (CreateSubnetCommand::class.simpleName == (command.payloadType.simpleName)){
        val interceptCommand = command.payload as CreateSubnetCommand
        privateNetworkRepository
          .findById(interceptCommand.privateNetworkId)
          // ..some validation logic here ex.
          // .filter { network -> network.isSubnetOverlap() }
          .switchIfEmpty(Mono.error(IllegalArgumentException("Requested subnet is overlap with the previous subnet.")))
          // .block() also doesn't work here it throws error
         // block()/blockFirst()/blockLast() are blocking, which is not supported in thread reactor-
      }
      command
    }
  }
}
axon axon-framework kotlin
2021-11-24 06:18:54
1

La meilleure réponse

3

L'abonnement à un réactif de dépôt à l'intérieur d'un message répartiteur n'est pas vraiment recommandé, et peuvent conduire à un comportement bizarre comme sous-fifre ThreadLocal (utilisé par Axox) n'est pas adapté pour être utilisé dans la programmation réactive

Au lieu de cela, découvrez l'Axone de l'Extension de Réactif et réactif intercepteurs de la section.

Par exemple ce que vous pouvez faire:

reactiveCommandGateway.registerDispatchInterceptor(
        cmdMono -> cmdMono.flatMap(cmd->privateNetworkRepository
      .findById(cmd.privateNetworkId))
.switchIfEmpty(
Mono.error(IllegalArgumentException("Requested subnet is overlap with the previous subnet."))
.then(cmdMono)));
2021-11-24 13:26:24

merci pour les conseils, d'ailleurs je ne vois pas de ReactorCommandBus dans l'extension dois-je utiliser ReactroCommandGateway à la place?
Patrick

oui, il y a seulement réactive passerelles pris en charge
schananas

Dans d'autres langues

Cette page est dans d'autres langues

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................