2017-04-19 21 views
1

나는 프로젝트 원자로와 내가 힘들어하는 곳 중 하나를 사용하기 시작했다. 어떻게 Mono에서 오는 것들을 Flux와 결합 시키는가?Flux의 결과와 Mono의 결과를 합치는 것

public interface GroupRepository { 
     Mono<GroupModel> getGroup(Long groupId); 
} 

public interface UserRepository { 
     Flux<User> getUsers(Set<Long> userIds); 
} 

Mono<GroupModel> groupMono = getGroup(groupId); 
Flux<User> userFlux = getUsers(Set<Long> users); 
//run above instrtuction in parallel and associate user to group. 

이제 내가 무엇을 달성하고자하는 것은 :

가 어떻게 group.addUsers (userfromFlux) 같은과, 그 그룹에 해당 사용자를 UserFlux에서 응답을 결합하여 연결할 수 있습니다 여기 내 사용 사례입니다.

누군가가 userFlux 및 groupMono에서 온 결과를 결합하는 방법을 도울 수 있습니까? 나는 Zip과 비슷한 것을 사용한다고 생각하지만, 소스에서 일대일 매핑을 수행한다. 필자의 경우, 1부터 N까지의 매핑이 필요하다. 여기에는 하나의 그룹이 있지만 그 그룹에 추가해야하는 여러 사용자가 있습니다. Mono<List<Users>을 반환 한 다음 모노로 Zip 연산자를 사용하고 여기에 언급 된 연결자를 제공하는 것이 좋습니다.
public static <T1, T2, O> Flux<O> zip(Publisher<? extends T1> source1, Publisher<? extends T2> source2, final BiFunction<? super T1, ? super T2, ? extends O> combinator)?

답변

3

정적 방법이 거기에 도움이 될 수 있다고 생각합니다. Mono은 1 개의 요소 만 방출하므로이 요소는 항상 Flux의 각 수신 값과 결합 된 요소가됩니다.

Flux.combineLatest(arr -> new Combination((GroupModel) arr[0], (User) arr[1]), 
        groupMono, userFlux); 
+0

필자의 경우 그룹 모델 내부의 기본 데이터 구조가 HashSet (그룹의 일부인 사용자 보유)이고 스레드로부터 안전하지 않기 때문에 Flux.zip (groupMono, userMono, BiFunction)을 사용하여 종료되었습니다. 그룹 내 사용자 흐름에서 유입되는 사용자를 반응 방식으로 추가합니다. 따라서 BiFunction을 사용하여 별도의 방법으로 그룹의 사용자를 채 웁니다. 도움을 주셔서 감사합니다. 정말 도움을 주셔서 감사합니다! – Coder

0

다른 사람들을위한 답변을 추가하려면 Flux.zip(groupMono, userMono(holding list of users), this::biFunctionToPopulateGroupWithUsers)을 사용했습니다. @Simon에서 제안한 것보다는이 방법을 사용했습니다. 사용자를 보유한 기본 그룹이 HashSet이고 사후 대응 방식으로 사용자를 추가하면 스레드로부터 안전하지 않기 때문입니다. 그러나 스레드 안전 데이터 구조를 가지고 있다면 @Simon의 제안을 사용할 것입니다.