我正在尝试将注册流程移至使用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"))
}
}
因此,在重新阅读了轴突文档之后,我意识到我可以返回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"))
}
}