#java #project-reactor #spring-webclient
#java #проект-реактор #spring-webclient
Вопрос:
Я использую WebClient от WebFlux для получения данных из удаленного Api.
Здесь около 1000 пользователей, у каждого из них несколько постов, к каждому посту есть несколько комментариев.
Вот конечные точки с соответствующими методами:
GET /users
GET /users/{userId}/posts/{postId}/comments
Flux<User> getUsers() {
return client
.get()
.uri("/users")
.retrieve()
.bodyToMono(UserResponse.class)
.flatMapIterable(UserResponse::getData);
}
Mono<Comment> getComments(Long userId, Long postId) {
return client
.get()
.uri("/users/{userId}/posts/{postId}/comments", userId, postId)
.retrieve()
.bodyToMono(CommentResponse.class)
.map(CommentResponse::getData);
}
Просто интересно, почему execute2() выполняется в ~ 2 раза дольше, чем первый? Разве они не должны быть одинаковыми, или я что-то упускаю?
Потому что с вложенными плоскими картами я могу получить все данные, необходимые в конце выполнения, но с первой я должен использовать кортежи для передачи данных через все операторы.
void execute1() {
getUsers()
.flatMap(user -> Flux.fromIterable(user.getPosts())
.map(post -> Tuples.of(user, post)))
.flatMap(tuple2 -> getComments(tuple2.getT1().getId(), tuple2.getT2().getId())
.map(comment -> Tuples.of(tuple2.getT1(), tuple2.getT2(), comment)))
.collectList()
.block();
}
void execute2() {
getUsers()
.flatMap(user ->
Flux.fromIterable(user.getPosts())
.flatMap(post ->
getComments(user.getId(), post.getId())
.map(comment -> Tuples.of(user, post, comment))))
.collectList()
.block();
}
Объект ответа:
@Data
class UserResponse {
private List<User> data;
}
@Data
class User {
private long id;
private List<Post> posts;
}
@Data
class Post {
private long id;
private String title;
}
@Data
class CommentResponse {
private Comment data;
}
@Data
class Comment {
private long id;
private String message;
}
Комментарии:
1. Несколько вопросов о невидимом коде.
user.getComments()
Возвращает ли список сообщений (не комментариев, как следует из названия)? ИgetComments(user,post)
должен возвращать только один комментарий (это Mono)?2. Извините, это была опечатка, должен был быть user.getPosts() вместо getComments() . Я обновил код. И я думаю, что это может быть связано с http-клиентом и его пулом .. потому что, если вы сделаете то же самое с макетными данными с некоторыми задержками, без использования webclient: время выполнения такое же