Axon Webflux QueryGateway如何处理Mono响应类型

问题描述 投票:0回答:1

我正在尝试将注册流程移至使用Spring Webflux作为POC的反应式设置,我们已经使用AxonFramework来实现CQRS和ES。我们的命令流程进行了相当直接的转换,但是我在转换查询方面遇到了麻烦。

[当我尝试转换返回单声道响应类型的点对点查询时,问题浮出水面,如果我指定了单声道响应类型,则会得到“找不到具有响应类型的[查询]的处理程序”

有人可以帮我弄清楚如何使用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"))
                    }
                }
spring-webflux cqrs axon
1个回答
0
投票

因此,在重新阅读了轴突文档之后,我意识到我可以返回CompletableFuture,经过一小段重构后,它终于可以工作了

QueryHandler:

@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"))
                    }
                }
© www.soinside.com 2019 - 2024. All rights reserved.