16
16
17
17
package org .springframework .integration .rsocket ;
18
18
19
- import java .lang .reflect .Method ;
20
- import java .nio .charset .StandardCharsets ;
21
- import java .util .Collections ;
22
- import java .util .HashMap ;
23
19
import java .util .Map ;
24
20
import java .util .function .BiFunction ;
25
21
import java .util .function .Consumer ;
26
22
23
+ import org .springframework .beans .BeansException ;
24
+ import org .springframework .context .ApplicationContext ;
27
25
import org .springframework .context .ApplicationEventPublisher ;
28
26
import org .springframework .context .ApplicationEventPublisherAware ;
29
27
import org .springframework .core .io .buffer .DataBuffer ;
30
28
import 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 ;
35
29
import 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 ;
38
31
import org .springframework .util .Assert ;
39
- import org .springframework .util .ReflectionUtils ;
32
+ import org .springframework .util .MimeType ;
40
33
41
34
import io .rsocket .RSocketFactory ;
42
35
import io .rsocket .transport .ServerTransport ;
56
49
*
57
50
* @see RSocketFactory.ServerRSocketFactory
58
51
*/
59
- public class ServerRSocketConnector extends AbstractRSocketConnector
60
- implements ApplicationEventPublisherAware {
52
+ public class ServerRSocketConnector extends AbstractRSocketConnector implements ApplicationEventPublisherAware {
61
53
62
54
private final ServerTransport <CloseableChannel > serverTransport ;
63
55
64
56
private Consumer <RSocketFactory .ServerRSocketFactory > factoryConfigurer = (serverRSocketFactory ) -> { };
65
57
66
58
private Mono <CloseableChannel > serverMono ;
67
59
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
+
68
73
/**
69
74
* Instantiate a server connector based on the {@link TcpServerTransport}.
70
75
* @param bindAddress the local address to bind TCP server onto.
@@ -111,41 +116,79 @@ public void setFactoryConfigurer(Consumer<RSocketFactory.ServerRSocketFactory> f
111
116
public void setClientRSocketKeyStrategy (BiFunction <Map <String , Object >,
112
117
DataBuffer , Object > clientRSocketKeyStrategy ) {
113
118
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
+ }
116
150
}
117
151
118
152
@ Override
119
153
public void setApplicationEventPublisher (ApplicationEventPublisher applicationEventPublisher ) {
120
- serverRSocketMessageHandler ().applicationEventPublisher = applicationEventPublisher ;
154
+ if (this .serverTransport != null ) {
155
+ serverRSocketMessageHandler ().setApplicationEventPublisher (applicationEventPublisher );
156
+ }
121
157
}
122
158
123
159
@ Override
124
160
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
+ }
135
173
}
136
174
137
175
public Map <Object , RSocketRequester > getClientRSocketRequesters () {
138
- return Collections . unmodifiableMap ( serverRSocketMessageHandler ().clientRSocketRequesters );
176
+ return serverRSocketMessageHandler ().getClientRSocketRequesters ( );
139
177
}
140
178
141
179
@ Nullable
142
180
public RSocketRequester getClientRSocketRequester (Object key ) {
143
- return serverRSocketMessageHandler (). clientRSocketRequesters .get (key );
181
+ return getClientRSocketRequesters () .get (key );
144
182
}
145
183
146
184
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
+ }
149
192
}
150
193
151
194
private ServerRSocketMessageHandler serverRSocketMessageHandler () {
@@ -154,14 +197,18 @@ private ServerRSocketMessageHandler serverRSocketMessageHandler() {
154
197
155
198
@ Override
156
199
protected void doStart () {
157
- this .serverMono .subscribe ();
200
+ if (this .serverTransport != null ) {
201
+ this .serverMono .subscribe ();
202
+ }
158
203
}
159
204
160
205
@ Override
161
206
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
+ }
165
212
}
166
213
167
214
@ Override
@@ -170,47 +217,4 @@ public void afterSingletonsInstantiated() {
170
217
serverRSocketMessageHandler ().registerHandleConnectionSetupMethod ();
171
218
}
172
219
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
-
216
220
}
0 commit comments