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"))
}
}
我正在尝试将我们的注册流程移动到反应式设置,使用 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"))
}
}