1717package org .springframework .graphql .client ;
1818
1919import java .net .URI ;
20+ import java .util .List ;
2021import java .util .function .Consumer ;
2122
23+ import io .rsocket .loadbalance .LoadbalanceStrategy ;
24+ import io .rsocket .loadbalance .LoadbalanceTarget ;
2225import io .rsocket .transport .ClientTransport ;
2326import io .rsocket .transport .netty .client .TcpClientTransport ;
2427import io .rsocket .transport .netty .client .WebsocketClientTransport ;
28+ import org .reactivestreams .Publisher ;
2529import reactor .core .publisher .Mono ;
2630
2731import org .springframework .lang .Nullable ;
@@ -45,6 +49,12 @@ final class DefaultRSocketGraphQlClientBuilder
4549
4650 private final RSocketRequester .Builder requesterBuilder ;
4751
52+ @ Nullable
53+ private Publisher <List <LoadbalanceTarget >> targetPublisher ;
54+
55+ @ Nullable
56+ private LoadbalanceStrategy loadbalanceStrategy ;
57+
4858 @ Nullable
4959 private ClientTransport clientTransport ;
5060
@@ -87,8 +97,17 @@ public DefaultRSocketGraphQlClientBuilder webSocket(URI uri) {
8797 }
8898
8999 @ Override
90- public DefaultRSocketGraphQlClientBuilder clientTransport (ClientTransport clientTransport ) {
91- this .clientTransport = clientTransport ;
100+ public DefaultRSocketGraphQlClientBuilder clientTransport (ClientTransport transport ) {
101+ this .clientTransport = transport ;
102+ return this ;
103+ }
104+
105+ @ Override
106+ public DefaultRSocketGraphQlClientBuilder clientTransports (
107+ Publisher <List <LoadbalanceTarget >> publisher , LoadbalanceStrategy strategy ) {
108+
109+ this .targetPublisher = publisher ;
110+ this .loadbalanceStrategy = strategy ;
92111 return this ;
93112 }
94113
@@ -106,8 +125,8 @@ public DefaultRSocketGraphQlClientBuilder route(String route) {
106125 }
107126
108127 @ Override
109- public DefaultRSocketGraphQlClientBuilder rsocketRequester (Consumer <RSocketRequester .Builder > requesterConsumer ) {
110- requesterConsumer .accept (this .requesterBuilder );
128+ public DefaultRSocketGraphQlClientBuilder rsocketRequester (Consumer <RSocketRequester .Builder > consumer ) {
129+ consumer .accept (this .requesterBuilder );
111130 return this ;
112131 }
113132
@@ -120,13 +139,25 @@ public RSocketGraphQlClient build() {
120139 builder .encoders (encoders -> setJsonEncoder (CodecDelegate .findJsonEncoder (encoders )));
121140 });
122141
123- Assert .state (this .clientTransport != null , "Neither WebSocket nor TCP networking configured" );
124- RSocketRequester requester = this .requesterBuilder .transport (this .clientTransport );
125- RSocketGraphQlTransport graphQlTransport = new RSocketGraphQlTransport (this .route , requester , getJsonDecoder ());
142+ RSocketRequester requester ;
143+
144+ if (this .clientTransport != null ) {
145+ requester = this .requesterBuilder .transport (this .clientTransport );
146+ }
147+ else if (this .targetPublisher != null && this .loadbalanceStrategy != null ) {
148+ requester = this .requesterBuilder .transports (this .targetPublisher , this .loadbalanceStrategy );
149+ }
150+ else {
151+ throw new IllegalStateException ("Neither ClientTransport, nor Loadbalance targets and strategy" );
152+ }
153+
154+ RSocketGraphQlTransport graphQlTransport =
155+ new RSocketGraphQlTransport (this .route , requester , getJsonDecoder ());
126156
127157 return new DefaultRSocketGraphQlClient (
128158 super .buildGraphQlClient (graphQlTransport ), requester ,
129- this .requesterBuilder , this .clientTransport , this .route , getBuilderInitializer ());
159+ this .requesterBuilder , this .clientTransport , this .targetPublisher , this .loadbalanceStrategy ,
160+ this .route , getBuilderInitializer ());
130161 }
131162
132163
@@ -139,21 +170,33 @@ private static class DefaultRSocketGraphQlClient extends AbstractDelegatingGraph
139170
140171 private final RSocketRequester .Builder requesterBuilder ;
141172
173+ @ Nullable
142174 private final ClientTransport clientTransport ;
143175
176+ @ Nullable
177+ private final Publisher <List <LoadbalanceTarget >> targetPublisher ;
178+
179+ @ Nullable
180+ private final LoadbalanceStrategy loadbalanceStrategy ;
181+
144182 private final String route ;
145183
146184 private final Consumer <AbstractGraphQlClientBuilder <?>> builderInitializer ;
147185
148186 DefaultRSocketGraphQlClient (
149- GraphQlClient graphQlClient , RSocketRequester requester , RSocketRequester .Builder requesterBuilder ,
150- ClientTransport clientTransport , String route , Consumer <AbstractGraphQlClientBuilder <?>> builderInitializer ) {
187+ GraphQlClient graphQlClient ,
188+ RSocketRequester requester , RSocketRequester .Builder requesterBuilder ,
189+ @ Nullable ClientTransport clientTransport ,
190+ @ Nullable Publisher <List <LoadbalanceTarget >> targetPublisher , @ Nullable LoadbalanceStrategy strategy ,
191+ String route , Consumer <AbstractGraphQlClientBuilder <?>> builderInitializer ) {
151192
152193 super (graphQlClient );
153194
154195 this .requester = requester ;
155196 this .requesterBuilder = requesterBuilder ;
156197 this .clientTransport = clientTransport ;
198+ this .targetPublisher = targetPublisher ;
199+ this .loadbalanceStrategy = strategy ;
157200 this .route = route ;
158201 this .builderInitializer = builderInitializer ;
159202 }
@@ -173,7 +216,12 @@ public Mono<Void> stop() {
173216 @ Override
174217 public RSocketGraphQlClient .Builder <?> mutate () {
175218 DefaultRSocketGraphQlClientBuilder builder = new DefaultRSocketGraphQlClientBuilder (this .requesterBuilder );
176- builder .clientTransport (this .clientTransport );
219+ if (this .clientTransport != null ) {
220+ builder .clientTransport (this .clientTransport );
221+ }
222+ if (this .targetPublisher != null && this .loadbalanceStrategy != null ) {
223+ builder .clientTransports (this .targetPublisher , this .loadbalanceStrategy );
224+ }
177225 builder .route (this .route );
178226 this .builderInitializer .accept (builder );
179227 return builder ;
0 commit comments