【问题标题】:Axon Webflux QueryGateway how to handle Mono ResponseTypesAxon Webflux QueryGateway 如何处理 Mono ResponseTypes
【发布时间】:2019-12-01 20:08:39
【问题描述】:

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

当我尝试转换返回 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"))
                    }
                }

【问题讨论】:

    标签: spring-webflux cqrs axon


    【解决方案1】:

    因此,在重新阅读 axon 文档后,我意识到我可以返回 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"))
                        }
                    }
    

    【讨论】:

    • 如果您觉得您自己的答案是对您的问题的解决方案,不妨将其标记为未来的读者?
    猜你喜欢
    • 2019-06-04
    • 1970-01-01
    • 2020-03-22
    • 1970-01-01
    • 2018-12-17
    • 1970-01-01
    • 2018-12-12
    • 2020-09-18
    • 2020-11-14
    相关资源
    最近更新 更多