Register annotated handlers in RSocketRequester
Prior to this commit, there would be no easy way to register client RSocket handlers against an `RSocketRequester` instance. The only solution was to gather all handlers and wrap them in a `RSocketMessageHandler` and configure it as an acceptor on the client RSocket. This commit adds a convenience method on the `RSocketRequester` builder to tkae care of this part of the infrastructure. Closes gh-23170
This commit is contained in:
@@ -18,17 +18,20 @@ package org.springframework.messaging.rsocket;
|
||||
|
||||
import java.net.URI;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import io.rsocket.RSocketFactory;
|
||||
import io.rsocket.frame.decoder.PayloadDecoder;
|
||||
import io.rsocket.transport.ClientTransport;
|
||||
import io.rsocket.transport.netty.client.TcpClientTransport;
|
||||
import io.rsocket.transport.netty.client.WebsocketClientTransport;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
import org.springframework.lang.Nullable;
|
||||
import org.springframework.messaging.rsocket.annotation.support.RSocketMessageHandler;
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.util.MimeType;
|
||||
|
||||
@@ -53,6 +56,7 @@ final class DefaultRSocketRequesterBuilder implements RSocketRequester.Builder {
|
||||
|
||||
private List<Consumer<RSocketStrategies.Builder>> strategiesConfigurers = new ArrayList<>();
|
||||
|
||||
private List<Object> handlers = new ArrayList<>();
|
||||
|
||||
@Override
|
||||
public RSocketRequester.Builder dataMimeType(@Nullable MimeType mimeType) {
|
||||
@@ -79,6 +83,12 @@ final class DefaultRSocketRequesterBuilder implements RSocketRequester.Builder {
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public RSocketRequester.Builder annotatedHandlers(Object... handlers) {
|
||||
this.handlers.addAll(Arrays.asList(handlers));
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public RSocketRequester.Builder rsocketStrategies(Consumer<RSocketStrategies.Builder> configurer) {
|
||||
this.strategiesConfigurers.add(configurer);
|
||||
@@ -101,7 +111,6 @@ final class DefaultRSocketRequesterBuilder implements RSocketRequester.Builder {
|
||||
}
|
||||
|
||||
private Mono<RSocketRequester> doConnect(ClientTransport transport) {
|
||||
|
||||
RSocketStrategies rsocketStrategies = getRSocketStrategies();
|
||||
Assert.isTrue(!rsocketStrategies.encoders().isEmpty(), "No encoders");
|
||||
Assert.isTrue(!rsocketStrategies.decoders().isEmpty(), "No decoders");
|
||||
@@ -110,6 +119,15 @@ final class DefaultRSocketRequesterBuilder implements RSocketRequester.Builder {
|
||||
MimeType dataMimeType = getDataMimeType(rsocketStrategies);
|
||||
rsocketFactory.dataMimeType(dataMimeType.toString());
|
||||
rsocketFactory.metadataMimeType(this.metadataMimeType.toString());
|
||||
|
||||
if (!this.handlers.isEmpty()) {
|
||||
RSocketMessageHandler messageHandler = new RSocketMessageHandler();
|
||||
messageHandler.setHandlers(this.handlers);
|
||||
messageHandler.setRSocketStrategies(rsocketStrategies);
|
||||
messageHandler.afterPropertiesSet();
|
||||
rsocketFactory.acceptor(messageHandler.clientAcceptor());
|
||||
}
|
||||
rsocketFactory.frameDecoder(PayloadDecoder.ZERO_COPY);
|
||||
this.factoryConfigurers.forEach(consumer -> consumer.accept(rsocketFactory));
|
||||
|
||||
return rsocketFactory.transport(transport)
|
||||
|
||||
@@ -30,6 +30,7 @@ import reactor.core.publisher.Mono;
|
||||
import org.springframework.core.ParameterizedTypeReference;
|
||||
import org.springframework.core.ReactiveAdapterRegistry;
|
||||
import org.springframework.lang.Nullable;
|
||||
import org.springframework.messaging.rsocket.annotation.support.RSocketMessageHandler;
|
||||
import org.springframework.util.MimeType;
|
||||
|
||||
/**
|
||||
@@ -158,6 +159,17 @@ public interface RSocketRequester {
|
||||
*/
|
||||
RSocketRequester.Builder rsocketStrategies(Consumer<RSocketStrategies.Builder> configurer);
|
||||
|
||||
/**
|
||||
* Add handlers for processing requests sent by the server.
|
||||
* <p>This is a shortcut for registering client handlers (i.e. annotated controllers)
|
||||
* to a {@link RSocketMessageHandler} and configuring it as an acceptor.
|
||||
* You can take full control by manually registering an acceptor on the
|
||||
* {@link RSocketFactory.ClientRSocketFactory} using {@link #rsocketFactory(Consumer)}
|
||||
* instead.
|
||||
* @param handlers the client handlers to configure on the requester
|
||||
*/
|
||||
RSocketRequester.Builder annotatedHandlers(Object... handlers);
|
||||
|
||||
/**
|
||||
* Connect to the RSocket server over TCP.
|
||||
* @param host the server host
|
||||
|
||||
Reference in New Issue
Block a user