18
18
19
19
import java .net .URI ;
20
20
import java .util .function .Consumer ;
21
+ import java .util .function .Function ;
21
22
22
- import org .springframework .beans .factory .DisposableBean ;
23
- import org .springframework .beans .factory .InitializingBean ;
23
+ import org .springframework .context .SmartLifecycle ;
24
24
import org .springframework .messaging .rsocket .RSocketRequester ;
25
- import org .springframework .messaging .rsocket .RSocketStrategies ;
26
25
import org .springframework .util .Assert ;
27
- import org .springframework .util .MimeType ;
28
- import org .springframework .util .MimeTypeUtils ;
29
26
30
27
import io .rsocket .Payload ;
31
28
import io .rsocket .RSocket ;
39
36
import reactor .core .publisher .Mono ;
40
37
41
38
/**
42
- * A client connector to the RSocket server.
39
+ * A client {@link AbstractRSocketConnector} extension to the RSocket server.
40
+ * <p>
41
+ * Note: the {@link RSocketFactory.ClientRSocketFactory#acceptor(Function)}
42
+ * in the provided {@link #factoryConfigurer} is overridden with an internal {@link IntegrationRSocketAcceptor}
43
+ * for the proper Spring Integration channel adapter mappings.
43
44
*
44
45
* @author Artem Bilan
45
46
*
48
49
* @see RSocketFactory.ClientRSocketFactory
49
50
* @see RSocketRequester
50
51
*/
51
- public class ClientRSocketConnector implements InitializingBean , DisposableBean {
52
+ public class ClientRSocketConnector extends AbstractRSocketConnector implements SmartLifecycle {
52
53
53
54
private final ClientTransport clientTransport ;
54
55
55
- private MimeType dataMimeType = MimeTypeUtils .TEXT_PLAIN ;
56
-
57
- private Payload connectPayload = EmptyPayload .INSTANCE ;
56
+ private Consumer <RSocketFactory .ClientRSocketFactory > factoryConfigurer = (clientRSocketFactory ) -> { };
58
57
59
- private RSocketStrategies rsocketStrategies = RSocketStrategies . builder (). build () ;
58
+ private String connectRoute ;
60
59
61
- private Consumer < RSocketFactory . ClientRSocketFactory > factoryConfigurer = ( clientRSocketFactory ) -> { } ;
60
+ private String connectData = "" ;
62
61
63
62
private Mono <RSocket > rsocketMono ;
64
63
64
+ private volatile boolean running ;
65
+
66
+ private boolean autoConnect ;
67
+
65
68
public ClientRSocketConnector (String host , int port ) {
66
69
this (TcpClientTransport .create (host , port ));
67
70
}
@@ -75,50 +78,80 @@ public ClientRSocketConnector(ClientTransport clientTransport) {
75
78
this .clientTransport = clientTransport ;
76
79
}
77
80
78
- public void setDataMimeType (MimeType dataMimeType ) {
79
- Assert .notNull (dataMimeType , "'dataMimeType' must not be null" );
80
- this .dataMimeType = dataMimeType ;
81
- }
82
-
83
81
public void setFactoryConfigurer (Consumer <RSocketFactory .ClientRSocketFactory > factoryConfigurer ) {
84
82
Assert .notNull (factoryConfigurer , "'factoryConfigurer' must not be null" );
85
83
this .factoryConfigurer = factoryConfigurer ;
86
84
}
87
85
88
- public void setRSocketStrategies (RSocketStrategies rsocketStrategies ) {
89
- Assert .notNull (rsocketStrategies , "'rsocketStrategies' must not be null" );
90
- this .rsocketStrategies = rsocketStrategies ;
86
+ public void setConnectRoute (String connectRoute ) {
87
+ this .connectRoute = connectRoute ;
91
88
}
92
89
93
- public void setConnectRoute (String connectRoute ) {
94
- this .connectPayload = DefaultPayload .create ("" , connectRoute );
90
+ public void setConnectData (String connectData ) {
91
+ Assert .notNull (connectData , "'connectData' must not be null" );
92
+ this .connectData = connectData ;
95
93
}
96
94
97
95
@ Override
98
96
public void afterPropertiesSet () {
97
+ super .afterPropertiesSet ();
99
98
RSocketFactory .ClientRSocketFactory clientFactory =
100
99
RSocketFactory .connect ()
101
- .dataMimeType (this . dataMimeType .toString ());
100
+ .dataMimeType (getDataMimeType () .toString ());
102
101
this .factoryConfigurer .accept (clientFactory );
103
- clientFactory .setupPayload (this .connectPayload );
102
+ clientFactory .acceptor (this .rsocketAcceptor );
103
+ Payload connectPayload = EmptyPayload .INSTANCE ;
104
+ if (this .connectRoute != null ) {
105
+ connectPayload = DefaultPayload .create (this .connectData , this .connectRoute );
106
+ }
107
+ clientFactory .setupPayload (connectPayload );
104
108
this .rsocketMono = clientFactory .transport (this .clientTransport ).start ().cache ();
105
109
}
106
110
107
- public void connect () {
108
- this .rsocketMono .subscribe ();
109
- }
110
-
111
- public Mono <RSocketRequester > getRSocketRequester () {
112
- return this .rsocketMono
113
- .map (rsocket -> RSocketRequester .wrap (rsocket , this .dataMimeType , this .rsocketStrategies ))
114
- .cache ();
111
+ @ Override
112
+ public void afterSingletonsInstantiated () {
113
+ this .autoConnect = this .rsocketAcceptor .detectEndpoints ();
115
114
}
116
115
117
116
@ Override
118
117
public void destroy () {
118
+ super .destroy ();
119
119
this .rsocketMono
120
120
.doOnNext (Disposable ::dispose )
121
121
.subscribe ();
122
122
}
123
123
124
+ @ Override
125
+ public void start () {
126
+ if (!this .running ) {
127
+ this .running = true ;
128
+ if (this .autoConnect ) {
129
+ connect ();
130
+ }
131
+ }
132
+ }
133
+
134
+ @ Override
135
+ public void stop () {
136
+ this .running = false ;
137
+ }
138
+
139
+ @ Override
140
+ public boolean isRunning () {
141
+ return this .running ;
142
+ }
143
+
144
+ /**
145
+ * Perform subscription into the RSocket server for incoming requests.
146
+ */
147
+ public void connect () {
148
+ this .rsocketMono .subscribe ();
149
+ }
150
+
151
+ public Mono <RSocketRequester > getRSocketRequester () {
152
+ return this .rsocketMono
153
+ .map (rsocket -> RSocketRequester .wrap (rsocket , getDataMimeType (), getRSocketStrategies ()))
154
+ .cache ();
155
+ }
156
+
124
157
}
0 commit comments