1616
1717package org .springframework .integration .rsocket ;
1818
19- import java .lang .reflect .Method ;
20- import java .nio .charset .StandardCharsets ;
21- import java .util .Collections ;
22- import java .util .HashMap ;
2319import java .util .Map ;
2420import java .util .function .BiFunction ;
2521import java .util .function .Consumer ;
2622
23+ import org .springframework .beans .BeansException ;
24+ import org .springframework .context .ApplicationContext ;
2725import org .springframework .context .ApplicationEventPublisher ;
2826import org .springframework .context .ApplicationEventPublisherAware ;
2927import org .springframework .core .io .buffer .DataBuffer ;
3028import org .springframework .lang .Nullable ;
31- import org .springframework .messaging .Message ;
32- import org .springframework .messaging .MessageHeaders ;
33- import org .springframework .messaging .handler .CompositeMessageCondition ;
34- import org .springframework .messaging .handler .DestinationPatternsMessageCondition ;
3529import org .springframework .messaging .rsocket .RSocketRequester ;
36- import org .springframework .messaging .rsocket .annotation .support .RSocketFrameTypeMessageCondition ;
37- import org .springframework .messaging .rsocket .annotation .support .RSocketRequesterMethodArgumentResolver ;
30+ import org .springframework .messaging .rsocket .RSocketStrategies ;
3831import org .springframework .util .Assert ;
39- import org .springframework .util .ReflectionUtils ;
32+ import org .springframework .util .MimeType ;
4033
4134import io .rsocket .RSocketFactory ;
4235import io .rsocket .transport .ServerTransport ;
5649 *
5750 * @see RSocketFactory.ServerRSocketFactory
5851 */
59- public class ServerRSocketConnector extends AbstractRSocketConnector
60- implements ApplicationEventPublisherAware {
52+ public class ServerRSocketConnector extends AbstractRSocketConnector implements ApplicationEventPublisherAware {
6153
6254 private final ServerTransport <CloseableChannel > serverTransport ;
6355
6456 private Consumer <RSocketFactory .ServerRSocketFactory > factoryConfigurer = (serverRSocketFactory ) -> { };
6557
6658 private Mono <CloseableChannel > serverMono ;
6759
60+ /**
61+ * Instantiate a server connector based on a provided {@link ServerRSocketMessageHandler}
62+ * with an assumption that RSocket server is created externally as well.
63+ * All other options are ignored in favor of provided {@link ServerRSocketMessageHandler}
64+ * and its external RSocket server configuration.
65+ * @param serverRSocketMessageHandler the {@link ServerRSocketMessageHandler} to rely on.
66+ * @since 5.2.1
67+ */
68+ public ServerRSocketConnector (ServerRSocketMessageHandler serverRSocketMessageHandler ) {
69+ super (serverRSocketMessageHandler );
70+ this .serverTransport = null ;
71+ }
72+
6873 /**
6974 * Instantiate a server connector based on the {@link TcpServerTransport}.
7075 * @param bindAddress the local address to bind TCP server onto.
@@ -111,41 +116,79 @@ public void setFactoryConfigurer(Consumer<RSocketFactory.ServerRSocketFactory> f
111116 public void setClientRSocketKeyStrategy (BiFunction <Map <String , Object >,
112117 DataBuffer , Object > clientRSocketKeyStrategy ) {
113118
114- Assert .notNull (clientRSocketKeyStrategy , "'clientRSocketKeyStrategy' must not be null" );
115- serverRSocketMessageHandler ().clientRSocketKeyStrategy = clientRSocketKeyStrategy ;
119+ if (this .serverTransport != null ) {
120+ serverRSocketMessageHandler ().setClientRSocketKeyStrategy (clientRSocketKeyStrategy );
121+ }
122+ }
123+
124+ @ Override
125+ public void setDataMimeType (@ Nullable MimeType dataMimeType ) {
126+ if (this .serverTransport != null ) {
127+ super .setDataMimeType (dataMimeType );
128+ }
129+ }
130+
131+ @ Override
132+ public void setMetadataMimeType (MimeType metadataMimeType ) {
133+ if (this .serverTransport != null ) {
134+ super .setMetadataMimeType (metadataMimeType );
135+ }
136+ }
137+
138+ @ Override
139+ public void setRSocketStrategies (RSocketStrategies rsocketStrategies ) {
140+ if (this .serverTransport != null ) {
141+ super .setRSocketStrategies (rsocketStrategies );
142+ }
143+ }
144+
145+ @ Override
146+ public void setApplicationContext (ApplicationContext applicationContext ) throws BeansException {
147+ if (this .serverTransport != null ) {
148+ super .setApplicationContext (applicationContext );
149+ }
116150 }
117151
118152 @ Override
119153 public void setApplicationEventPublisher (ApplicationEventPublisher applicationEventPublisher ) {
120- serverRSocketMessageHandler ().applicationEventPublisher = applicationEventPublisher ;
154+ if (this .serverTransport != null ) {
155+ serverRSocketMessageHandler ().setApplicationEventPublisher (applicationEventPublisher );
156+ }
121157 }
122158
123159 @ Override
124160 public void afterPropertiesSet () {
125- super .afterPropertiesSet ();
126- RSocketFactory .ServerRSocketFactory serverFactory = RSocketFactory .receive ();
127- this .factoryConfigurer .accept (serverFactory );
128-
129- this .serverMono =
130- serverFactory
131- .acceptor (serverRSocketMessageHandler ().responder ())
132- .transport (this .serverTransport )
133- .start ()
134- .cache ();
161+ if (this .serverTransport != null ) {
162+ super .afterPropertiesSet ();
163+ RSocketFactory .ServerRSocketFactory serverFactory = RSocketFactory .receive ();
164+ this .factoryConfigurer .accept (serverFactory );
165+
166+ this .serverMono =
167+ serverFactory
168+ .acceptor (serverRSocketMessageHandler ().responder ())
169+ .transport (this .serverTransport )
170+ .start ()
171+ .cache ();
172+ }
135173 }
136174
137175 public Map <Object , RSocketRequester > getClientRSocketRequesters () {
138- return Collections . unmodifiableMap ( serverRSocketMessageHandler ().clientRSocketRequesters );
176+ return serverRSocketMessageHandler ().getClientRSocketRequesters ( );
139177 }
140178
141179 @ Nullable
142180 public RSocketRequester getClientRSocketRequester (Object key ) {
143- return serverRSocketMessageHandler (). clientRSocketRequesters .get (key );
181+ return getClientRSocketRequesters () .get (key );
144182 }
145183
146184 public Mono <Integer > getBoundPort () {
147- return this .serverMono
148- .map ((server ) -> server .address ().getPort ());
185+ if (this .serverTransport != null ) {
186+ return this .serverMono
187+ .map ((server ) -> server .address ().getPort ());
188+ }
189+ else {
190+ return Mono .empty ();
191+ }
149192 }
150193
151194 private ServerRSocketMessageHandler serverRSocketMessageHandler () {
@@ -154,14 +197,18 @@ private ServerRSocketMessageHandler serverRSocketMessageHandler() {
154197
155198 @ Override
156199 protected void doStart () {
157- this .serverMono .subscribe ();
200+ if (this .serverTransport != null ) {
201+ this .serverMono .subscribe ();
202+ }
158203 }
159204
160205 @ Override
161206 public void destroy () {
162- this .serverMono
163- .doOnNext (Disposable ::dispose )
164- .subscribe ();
207+ if (this .serverTransport != null ) {
208+ this .serverMono
209+ .doOnNext (Disposable ::dispose )
210+ .subscribe ();
211+ }
165212 }
166213
167214 @ Override
@@ -170,47 +217,4 @@ public void afterSingletonsInstantiated() {
170217 serverRSocketMessageHandler ().registerHandleConnectionSetupMethod ();
171218 }
172219
173- private static class ServerRSocketMessageHandler extends IntegrationRSocketMessageHandler {
174-
175- private static final Method HANDLE_CONNECTION_SETUP_METHOD =
176- ReflectionUtils .findMethod (ServerRSocketMessageHandler .class , "handleConnectionSetup" , Message .class );
177-
178-
179- private final Map <Object , RSocketRequester > clientRSocketRequesters = new HashMap <>();
180-
181- private BiFunction <Map <String , Object >, DataBuffer , Object > clientRSocketKeyStrategy =
182- (headers , data ) -> data .toString (StandardCharsets .UTF_8 );
183-
184- private ApplicationEventPublisher applicationEventPublisher ;
185-
186- private void registerHandleConnectionSetupMethod () {
187- registerHandlerMethod (this , HANDLE_CONNECTION_SETUP_METHOD ,
188- new CompositeMessageCondition (
189- RSocketFrameTypeMessageCondition .CONNECT_CONDITION ,
190- new DestinationPatternsMessageCondition (new String [] { "*" }, obtainRouteMatcher ())));
191- }
192-
193- @ SuppressWarnings ("unused" )
194- private void handleConnectionSetup (Message <DataBuffer > connectMessage ) {
195- DataBuffer dataBuffer = connectMessage .getPayload ();
196- MessageHeaders messageHeaders = connectMessage .getHeaders ();
197- Object rsocketRequesterKey = this .clientRSocketKeyStrategy .apply (messageHeaders , dataBuffer );
198- RSocketRequester rsocketRequester =
199- messageHeaders .get (RSocketRequesterMethodArgumentResolver .RSOCKET_REQUESTER_HEADER ,
200- RSocketRequester .class );
201- this .clientRSocketRequesters .put (rsocketRequesterKey , rsocketRequester );
202- RSocketConnectedEvent rSocketConnectedEvent =
203- new RSocketConnectedEvent (this , messageHeaders , dataBuffer , rsocketRequester ); // NOSONAR
204- if (this .applicationEventPublisher != null ) {
205- this .applicationEventPublisher .publishEvent (rSocketConnectedEvent );
206- }
207- else {
208- if (logger .isInfoEnabled ()) {
209- logger .info ("The RSocket has been connected: " + rSocketConnectedEvent );
210- }
211- }
212- }
213-
214- }
215-
216220}
0 commit comments