17
17
package org .springframework .graphql .client ;
18
18
19
19
import java .net .URI ;
20
+ import java .util .List ;
20
21
import java .util .function .Consumer ;
21
22
23
+ import io .rsocket .loadbalance .LoadbalanceStrategy ;
24
+ import io .rsocket .loadbalance .LoadbalanceTarget ;
22
25
import io .rsocket .transport .ClientTransport ;
23
26
import io .rsocket .transport .netty .client .TcpClientTransport ;
24
27
import io .rsocket .transport .netty .client .WebsocketClientTransport ;
28
+ import org .reactivestreams .Publisher ;
25
29
import reactor .core .publisher .Mono ;
26
30
27
31
import org .springframework .lang .Nullable ;
@@ -45,6 +49,10 @@ final class DefaultRSocketGraphQlClientBuilder
45
49
46
50
private final RSocketRequester .Builder requesterBuilder ;
47
51
52
+ private Publisher <List <LoadbalanceTarget >> targetPublisher ;
53
+
54
+ private LoadbalanceStrategy loadbalanceStrategy ;
55
+
48
56
@ Nullable
49
57
private ClientTransport clientTransport ;
50
58
@@ -111,6 +119,13 @@ public DefaultRSocketGraphQlClientBuilder rsocketRequester(Consumer<RSocketReque
111
119
return this ;
112
120
}
113
121
122
+ @ Override
123
+ public DefaultRSocketGraphQlClientBuilder transports (Publisher <List <LoadbalanceTarget >> targetPublisher , LoadbalanceStrategy loadbalanceStrategy ) {
124
+ this .targetPublisher = targetPublisher ;
125
+ this .loadbalanceStrategy = loadbalanceStrategy ;
126
+ return this ;
127
+ }
128
+
114
129
@ Override
115
130
public RSocketGraphQlClient build () {
116
131
@@ -120,13 +135,20 @@ public RSocketGraphQlClient build() {
120
135
builder .encoders (encoders -> setJsonEncoder (CodecDelegate .findJsonEncoder (encoders )));
121
136
});
122
137
123
- Assert .state (this .clientTransport != null , "Neither WebSocket nor TCP networking configured" );
124
- RSocketRequester requester = this .requesterBuilder .transport (this .clientTransport );
138
+ RSocketRequester requester ;
139
+
140
+ if (this .targetPublisher != null && this .loadbalanceStrategy != null ) {
141
+ requester = this .requesterBuilder .transports (this .targetPublisher , this .loadbalanceStrategy );
142
+ } else {
143
+ Assert .state (this .clientTransport != null , "Neither WebSocket nor TCP networking configured" );
144
+ requester = this .requesterBuilder .transport (this .clientTransport );
145
+ }
125
146
RSocketGraphQlTransport graphQlTransport = new RSocketGraphQlTransport (this .route , requester , getJsonDecoder ());
126
147
127
148
return new DefaultRSocketGraphQlClient (
128
149
super .buildGraphQlClient (graphQlTransport ), requester ,
129
- this .requesterBuilder , this .clientTransport , this .route , getBuilderInitializer ());
150
+ this .requesterBuilder , this .clientTransport , this .targetPublisher , this .loadbalanceStrategy ,
151
+ this .route , getBuilderInitializer ());
130
152
}
131
153
132
154
@@ -141,19 +163,26 @@ private static class DefaultRSocketGraphQlClient extends AbstractDelegatingGraph
141
163
142
164
private final ClientTransport clientTransport ;
143
165
166
+ private final Publisher <List <LoadbalanceTarget >> targetPublisher ;
167
+
168
+ private final LoadbalanceStrategy loadbalanceStrategy ;
169
+
144
170
private final String route ;
145
171
146
172
private final Consumer <AbstractGraphQlClientBuilder <?>> builderInitializer ;
147
173
148
174
DefaultRSocketGraphQlClient (
149
175
GraphQlClient graphQlClient , RSocketRequester requester , RSocketRequester .Builder requesterBuilder ,
150
- ClientTransport clientTransport , String route , Consumer <AbstractGraphQlClientBuilder <?>> builderInitializer ) {
176
+ ClientTransport clientTransport , Publisher <List <LoadbalanceTarget >> targetPublisher , LoadbalanceStrategy loadbalanceStrategy ,
177
+ String route , Consumer <AbstractGraphQlClientBuilder <?>> builderInitializer ) {
151
178
152
179
super (graphQlClient );
153
180
154
181
this .requester = requester ;
155
182
this .requesterBuilder = requesterBuilder ;
156
183
this .clientTransport = clientTransport ;
184
+ this .targetPublisher = targetPublisher ;
185
+ this .loadbalanceStrategy = loadbalanceStrategy ;
157
186
this .route = route ;
158
187
this .builderInitializer = builderInitializer ;
159
188
}
@@ -174,6 +203,7 @@ public Mono<Void> stop() {
174
203
public RSocketGraphQlClient .Builder <?> mutate () {
175
204
DefaultRSocketGraphQlClientBuilder builder = new DefaultRSocketGraphQlClientBuilder (this .requesterBuilder );
176
205
builder .clientTransport (this .clientTransport );
206
+ builder .transports (this .targetPublisher , this .loadbalanceStrategy );
177
207
builder .route (this .route );
178
208
this .builderInitializer .accept (builder );
179
209
return builder ;
0 commit comments