在Spring Webflux中奇怪地执行Mono序列

时间:2019-03-04 13:10:05

标签: java spring spring-boot spring-webflux project-reactor

我有一个场景,我正在Mono序列中调用方法,具体取决于我调用序列的方式,是出错还是序列成功。

成功的顺序:

    @Override
    public Mono<User> getUserDetails(String userId) {
        return reactiveValueOps
            .get(userId)
            .switchIfEmpty(userService.getUser(Long.valueOf(userId))
                .flatMap(this::setUserDetails));
    }

    @Override
    public Mono<User> setUserDetails(User user) {
        return reactiveValueOps
            .set(String.valueOf(user.getId()), user, Duration.ofDays(SESSION_PERSISTENCE_DURATION))
            .flatMap(b -> Mono.just(user));
    }

错误序列:

    @Override
    public Mono<User> getUserDetails(String userId) {
        return reactiveValueOps
            .get(userId)
            .switchIfEmpty(Mono.defer(() -> {
                Mono<User> user = userService.getUser(Long.valueOf(userId));
                Mono<Boolean> valueSet = setUserDetails(user);
                return valueSet.zipWith(user, (v, u) -> u);
            }));
    }

    @Override
    public Mono<Boolean> setUserDetails(Mono<User> user) {
        return user.switchIfEmpty(Mono.defer(() ->
            Mono.error(new UnsupportedOperationException("Cannot persist empty User Object"))))
            .flatMap(u -> reactiveValueOps.set(String.valueOf(u.getId()), u, Duration.ofDays(1L)));
    }

userService.getUser方法要么从数据库返回用户,要么创建一个新用户,该用户从第三方API获取详细信息,在第二顺序中,我得到此错误:

ERROR: duplicate key value violates unique constraint 仅当用户尚未存在于数据库中时,才会发生此错误;如果数据库中仅存在用户,并且仅针对第二个执行流程,则不会发生此错误。 我使用zipWith时会发生问题吗?

0 个答案:

没有答案