Axon Webflux QueryGateway 如何处理 Mono ResponseTypes

Axon Webflux QueryGateway how to handle Mono ResponseTypes

我正在尝试将我们的注册流程移动到反应式设置,使用 Spring Webflux 作为 POC,我们使用 AxonFramework 来实现 CQRS 和 ES。我们的命令流转换得相当直接,但我在转换查询端时遇到了问题。

当我尝试转换 returns Mono 响应类型的点对点查询时出现问题,如果我指定 Mono ResponseType 我得到 "No Handler found for [query] with response type"

谁能帮我弄清楚如何使用 Mono ResponseTypes 处理查询?

查询处理程序:

@QueryHandler
fun handleIsEmailUniqueQuery(query: IsEmailUniqueQuery): Mono<Boolean> =
        accountRepository.findAccountByEmail(query.email)
                .flatMap { Mono.just(true) }
                .switchIfEmpty(Mono.just(false))

调用查询网关的代码

fun validateEmailUnique(request: CreateRegistrationRequest): Mono<CreateRegistrationCommand> =
        Mono.fromFuture(queryGateway.query(IsEmailUniqueQuery(request.email), ResponseTypes.instanceOf(Mono::class.java)))
                .flatMap { mono ->  mono.cast(Boolean::class.java)}
                .flatMap { isEmailUnique ->
                    when (isEmailUnique) {
                        true -> Mono.just(CreateRegistrationCommand(request.email, request.password, UUID.randomUUID().toString()))
                        else -> Mono.error(DomainValidationException("ERR_EMAIL_UNIQUE"))
                    }
                }

所以在重新阅读 axon 文档后我意识到我可以 return 一个 CompletableFuture 代替,经过一个小的重构它终于工作了

查询处理程序:

@QueryHandler
fun handleIsEmailUniqueQuery(query: IsEmailUniqueQuery): CompletableFuture<Boolean> =
        accountRepository.findAccountByEmail(query.email)
                .flatMap { Mono.just(false) }
                .switchIfEmpty(Mono.just(true))
                .toFuture()

调用queryGateway的代码

fun validateEmailUnique(request: CreateRegistrationRequest): Mono<CreateRegistrationCommand> =
        Mono.fromFuture(queryGateway.query(IsEmailUniqueQuery(request.email), ResponseTypes.instanceOf(Boolean::class.java)))
                .flatMap { isEmailUnique ->
                    when (isEmailUnique) {
                        true -> Mono.just(CreateRegistrationCommand(request.email, request.password, UUID.randomUUID().toString()))
                        else -> Mono.error(DomainValidationException("ERR_EMAIL_UNIQUE"))
                    }
                }