Skip to content

Commit f3d07c1

Browse files
committed
Polishing contribution
Closes gh-498
1 parent 0faa63b commit f3d07c1

File tree

2 files changed

+63
-38
lines changed

2 files changed

+63
-38
lines changed

spring-graphql/src/main/java/org/springframework/graphql/client/DefaultRSocketGraphQlClientBuilder.java

Lines changed: 39 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,10 @@ final class DefaultRSocketGraphQlClientBuilder
4949

5050
private final RSocketRequester.Builder requesterBuilder;
5151

52+
@Nullable
5253
private Publisher<List<LoadbalanceTarget>> targetPublisher;
5354

55+
@Nullable
5456
private LoadbalanceStrategy loadbalanceStrategy;
5557

5658
@Nullable
@@ -95,8 +97,17 @@ public DefaultRSocketGraphQlClientBuilder webSocket(URI uri) {
9597
}
9698

9799
@Override
98-
public DefaultRSocketGraphQlClientBuilder clientTransport(ClientTransport clientTransport) {
99-
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;
100111
return this;
101112
}
102113

@@ -114,15 +125,8 @@ public DefaultRSocketGraphQlClientBuilder route(String route) {
114125
}
115126

116127
@Override
117-
public DefaultRSocketGraphQlClientBuilder rsocketRequester(Consumer<RSocketRequester.Builder> requesterConsumer) {
118-
requesterConsumer.accept(this.requesterBuilder);
119-
return this;
120-
}
121-
122-
@Override
123-
public DefaultRSocketGraphQlClientBuilder transports(Publisher<List<LoadbalanceTarget>> targetPublisher, LoadbalanceStrategy loadbalanceStrategy) {
124-
this.targetPublisher = targetPublisher;
125-
this.loadbalanceStrategy = loadbalanceStrategy;
128+
public DefaultRSocketGraphQlClientBuilder rsocketRequester(Consumer<RSocketRequester.Builder> consumer) {
129+
consumer.accept(this.requesterBuilder);
126130
return this;
127131
}
128132

@@ -137,13 +141,18 @@ public RSocketGraphQlClient build() {
137141

138142
RSocketRequester requester;
139143

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+
if (this.clientTransport != null) {
144145
requester = this.requesterBuilder.transport(this.clientTransport);
145146
}
146-
RSocketGraphQlTransport graphQlTransport = new RSocketGraphQlTransport(this.route, requester, getJsonDecoder());
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());
147156

148157
return new DefaultRSocketGraphQlClient(
149158
super.buildGraphQlClient(graphQlTransport), requester,
@@ -161,19 +170,24 @@ private static class DefaultRSocketGraphQlClient extends AbstractDelegatingGraph
161170

162171
private final RSocketRequester.Builder requesterBuilder;
163172

173+
@Nullable
164174
private final ClientTransport clientTransport;
165175

176+
@Nullable
166177
private final Publisher<List<LoadbalanceTarget>> targetPublisher;
167178

179+
@Nullable
168180
private final LoadbalanceStrategy loadbalanceStrategy;
169181

170182
private final String route;
171183

172184
private final Consumer<AbstractGraphQlClientBuilder<?>> builderInitializer;
173185

174186
DefaultRSocketGraphQlClient(
175-
GraphQlClient graphQlClient, RSocketRequester requester, RSocketRequester.Builder requesterBuilder,
176-
ClientTransport clientTransport, Publisher<List<LoadbalanceTarget>> targetPublisher, LoadbalanceStrategy loadbalanceStrategy,
187+
GraphQlClient graphQlClient,
188+
RSocketRequester requester, RSocketRequester.Builder requesterBuilder,
189+
@Nullable ClientTransport clientTransport,
190+
@Nullable Publisher<List<LoadbalanceTarget>> targetPublisher, @Nullable LoadbalanceStrategy strategy,
177191
String route, Consumer<AbstractGraphQlClientBuilder<?>> builderInitializer) {
178192

179193
super(graphQlClient);
@@ -182,7 +196,7 @@ private static class DefaultRSocketGraphQlClient extends AbstractDelegatingGraph
182196
this.requesterBuilder = requesterBuilder;
183197
this.clientTransport = clientTransport;
184198
this.targetPublisher = targetPublisher;
185-
this.loadbalanceStrategy = loadbalanceStrategy;
199+
this.loadbalanceStrategy = strategy;
186200
this.route = route;
187201
this.builderInitializer = builderInitializer;
188202
}
@@ -202,8 +216,12 @@ public Mono<Void> stop() {
202216
@Override
203217
public RSocketGraphQlClient.Builder<?> mutate() {
204218
DefaultRSocketGraphQlClientBuilder builder = new DefaultRSocketGraphQlClientBuilder(this.requesterBuilder);
205-
builder.clientTransport(this.clientTransport);
206-
builder.transports(this.targetPublisher, this.loadbalanceStrategy);
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+
}
207225
builder.route(this.route);
208226
this.builderInitializer.accept(builder);
209227
return builder;

spring-graphql/src/main/java/org/springframework/graphql/client/RSocketGraphQlClient.java

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -82,27 +82,48 @@ static Builder<?> builder(RSocketRequester.Builder requesterBuilder) {
8282
interface Builder<B extends Builder<B>> extends GraphQlClient.Builder<B> {
8383

8484
/**
85-
* Select TCP as the underlying network protocol.
85+
* Select TCP as the underlying network protocol. This delegates to
86+
* {@link RSocketRequester.Builder#tcp(String, int)} to create the
87+
* {@code RSocketRequester} instance.
8688
* @param host the remote host to connect to
8789
* @param port the remote port to connect to
8890
* @return the same builder instance
8991
*/
9092
B tcp(String host, int port);
9193

9294
/**
93-
* Select WebSocket as the underlying network protocol.
95+
* Select WebSocket as the underlying network protocol. This delegates to
96+
* {@link RSocketRequester.Builder#websocket(URI)} to create the
97+
* {@code RSocketRequester} instance.
9498
* @param uri the URL for the WebSocket handshake
9599
* @return the same builder instance
96100
*/
97101
B webSocket(URI uri);
98102

99103
/**
100-
* Use a given {@link ClientTransport} to communicate with the remote server.
104+
* Use a given {@link ClientTransport} to communicate with the remote
105+
* server. This delegates to
106+
* {@link RSocketRequester.Builder#transport(ClientTransport)} to create
107+
* the {@code RSocketRequester} instance.
101108
* @param clientTransport the transport to use
102109
* @return the same builder instance
103110
*/
104111
B clientTransport(ClientTransport clientTransport);
105112

113+
/**
114+
* Use a {@link Publisher} of {@link LoadbalanceTarget}s, each of which
115+
* contains a {@link ClientTransport}. This delegates to
116+
* {@link RSocketRequester.Builder#transports(Publisher, LoadbalanceStrategy)}
117+
* to create the {@code RSocketRequester} instance.
118+
* @param targetPublisher supplies list of targets to loadbalance against;
119+
* the targets are replaced when the given {@code Publisher} emits again.
120+
* @param loadbalanceStrategy the strategy to use for selecting from
121+
* the list of targets.
122+
* @return the same builder instance
123+
* @since 1.0.3
124+
*/
125+
B clientTransports(Publisher<List<LoadbalanceTarget>> targetPublisher, LoadbalanceStrategy loadbalanceStrategy);
126+
106127
/**
107128
* Customize the format of data payloads for the connection.
108129
* <p>By default, this is set to {@code "application/graphql+json"} but
@@ -133,20 +154,6 @@ interface Builder<B extends Builder<B>> extends GraphQlClient.Builder<B> {
133154
*/
134155
B rsocketRequester(Consumer<RSocketRequester.Builder> requester);
135156

136-
/**
137-
* Build an {@link RSocketRequester} with an
138-
* {@link io.rsocket.loadbalance.LoadbalanceRSocketClient} that will
139-
* connect to one of the given targets selected through the given
140-
* {@link io.rsocket.loadbalance.LoadbalanceRSocketClient}.
141-
* @param targetPublisher a {@code Publisher} that supplies a list of
142-
* target transports to loadbalance against; the given list may be
143-
* periodically updated by the {@code Publisher}.
144-
* @param loadbalanceStrategy the strategy to use for selecting from
145-
* the list of loadbalance targets.
146-
* @return the same builder instance
147-
*/
148-
B transports(Publisher<List<LoadbalanceTarget>> targetPublisher, LoadbalanceStrategy loadbalanceStrategy);
149-
150157
/**
151158
* Build the {@code RSocketGraphQlClient} instance.
152159
*/

0 commit comments

Comments
 (0)