Axon Webflux QueryGateway 如何处理 Mono ResponseTypes



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

当我尝试转换返回 Mono 响应类型的点对点查询时,会出现问题,如果我指定 Mono 响应类型,我会得到"找不到具有响应类型的 [query] 的处理程序">

谁能帮我弄清楚如何使用单声道响应类型处理查询?

查询处理程序:

@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"))
}
}

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

了查询处理程序:

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

调用查询网关的代码

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"))
}
}

最新更新