Axonframework, como usar MessageDispatchInterceptor reativa repositório

0

Pergunta

Eu li o conjunto baseado em consistência de validação blog e quero validar através de um despacho do interceptor. Eu siga o exemplo, mas eu uso reativa repositório e realmente não funciona para mim. Eu tenho tentado tanto, bloco e bloco. com o bloco de lança de erro, mas sem bloqueá-lo, não executar nada. aqui é o meu código.

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

Melhor resposta

3

Assinando um reativa repositório de dentro de uma mensagem de despachante realmente não é recomendada e pode levar a comportamento estranho como subalterno de ThreadLocal (usado por Axox) não é adaptado para ser usado em programação reativa

Em vez disso, confira Axon Reativa da Extensão e reativa, interceptores seção.

Por exemplo, o que você pode fazer:

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

obrigado pelo conselho, btw, eu não vejo qualquer ReactorCommandBus na extensão devo usar ReactroCommandGateway em vez disso?
Patrick

sim, existem apenas reativa gateways suportados
schananas

Em outros idiomas

Esta página está em outros idiomas

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