Axonframework, cómo utilizar MessageDispatchInterceptor con reactivo repositorio

0

Pregunta

He leído el conjunto basado en la consistencia de validación blog y quiero validar a través de un despacho de interceptor. Yo sigo el ejemplo, pero yo uso reactiva repositorio y la verdad es que no trabajo para mí. He intentado tanto en bloque y no de bloque. con el bloque arroja error, pero sin bloquear no ejecutar nada. aquí está mi 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

Mejor respuesta

3

Suscribirse a un reactivo repositorio dentro de un mensaje despachador no es realmente recomendable y podría dar lugar a comportamientos extraños como subalterno ThreadLocal (utilizado por Axox) no está adaptado para ser utilizado en reactivos de programación

En su lugar, retirar del Axón Reactivo de Extensión y reactivos colectores de la sección.

Por ejemplo lo que se podría hacer:

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

gracias por los consejos, por cierto, no veo ninguna ReactorCommandBus en la extensión debo usar ReactroCommandGateway lugar?
Patrick

sí, sólo hay reactiva puertas de enlace compatibles
schananas

En otros idiomas

Esta página está en otros idiomas

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