我有一个场景,我正在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
时会发生问题吗?