19
19
import io .reactivesocket .Frame .Lease ;
20
20
import io .reactivesocket .Frame .Request ;
21
21
import io .reactivesocket .Frame .Response ;
22
+ import io .reactivesocket .events .EventListener ;
23
+ import io .reactivesocket .events .EventListener .RequestType ;
24
+ import io .reactivesocket .events .EventPublishingSocket ;
25
+ import io .reactivesocket .events .EventPublishingSocketImpl ;
22
26
import io .reactivesocket .exceptions .ApplicationException ;
23
27
import io .reactivesocket .exceptions .SetupException ;
24
28
import io .reactivesocket .frame .FrameHeaderFlyweight ;
29
+ import io .reactivesocket .internal .DisabledEventPublisher ;
30
+ import io .reactivesocket .internal .EventPublisher ;
25
31
import io .reactivesocket .internal .KnownErrorFilter ;
26
32
import io .reactivesocket .internal .RemoteReceiver ;
27
33
import io .reactivesocket .internal .RemoteSender ;
28
34
import io .reactivesocket .lease .LeaseEnforcingSocket ;
29
35
import io .reactivesocket .reactivestreams .extensions .Px ;
30
36
import io .reactivesocket .reactivestreams .extensions .internal .subscribers .Subscribers ;
37
+ import io .reactivesocket .util .Clock ;
31
38
import org .agrona .collections .Int2ObjectHashMap ;
32
39
import org .reactivestreams .Publisher ;
33
40
import org .reactivestreams .Subscription ;
34
41
35
42
import java .util .Collection ;
36
43
import java .util .function .Consumer ;
37
44
45
+ import static io .reactivesocket .events .EventListener .RequestType .*;
46
+
38
47
/**
39
48
* Server side ReactiveSocket. Receives {@link Frame}s from a
40
49
* {@link ClientReactiveSocket}
@@ -44,20 +53,28 @@ public class ServerReactiveSocket implements ReactiveSocket {
44
53
private final DuplexConnection connection ;
45
54
private final Publisher <Frame > serverInput ;
46
55
private final Consumer <Throwable > errorConsumer ;
56
+ private final EventPublisher <? extends EventListener > eventPublisher ;
47
57
48
58
private final Int2ObjectHashMap <Subscription > subscriptions ;
49
59
private final Int2ObjectHashMap <RemoteReceiver > channelProcessors ;
50
60
51
61
private final ReactiveSocket requestHandler ;
52
62
private Subscription receiversSubscription ;
63
+ private final EventPublishingSocket eventPublishingSocket ;
64
+
53
65
public ServerReactiveSocket (DuplexConnection connection , ReactiveSocket requestHandler ,
54
- boolean clientHonorsLease , Consumer <Throwable > errorConsumer ) {
66
+ boolean clientHonorsLease , Consumer <Throwable > errorConsumer ,
67
+ EventPublisher <? extends EventListener > eventPublisher ) {
55
68
this .requestHandler = requestHandler ;
56
69
this .connection = connection ;
57
70
serverInput = connection .receive ();
58
71
this .errorConsumer = new KnownErrorFilter (errorConsumer );
72
+ this .eventPublisher = eventPublisher ;
59
73
subscriptions = new Int2ObjectHashMap <>();
60
74
channelProcessors = new Int2ObjectHashMap <>();
75
+ eventPublishingSocket = eventPublisher .isEventPublishingEnabled ()?
76
+ new EventPublishingSocketImpl (eventPublisher , false ) : EventPublishingSocket .DISABLED ;
77
+
61
78
Px .from (connection .onClose ()).subscribe (Subscribers .cleanup (() -> {
62
79
cleanup ();
63
80
}));
@@ -74,6 +91,10 @@ public ServerReactiveSocket(DuplexConnection connection, ReactiveSocket requestH
74
91
});
75
92
}
76
93
}
94
+ public ServerReactiveSocket (DuplexConnection connection , ReactiveSocket requestHandler ,
95
+ boolean clientHonorsLease , Consumer <Throwable > errorConsumer ) {
96
+ this (connection , requestHandler , clientHonorsLease , errorConsumer , new DisabledEventPublisher <>());
97
+ }
77
98
78
99
public ServerReactiveSocket (DuplexConnection connection , ReactiveSocket requestHandler ,
79
100
Consumer <Throwable > errorConsumer ) {
@@ -165,19 +186,19 @@ private Publisher<Void> handleFrame(Frame frame) {
165
186
case SETUP :
166
187
return Px .error (new IllegalStateException ("Setup frame received post setup." ));
167
188
case REQUEST_RESPONSE :
168
- return handleReceive (streamId , requestResponse (frame ));
189
+ return handleRequestResponse (streamId , requestResponse (frame ));
169
190
case CANCEL :
170
191
return handleCancelFrame (streamId );
171
192
case KEEPALIVE :
172
193
return handleKeepAliveFrame (frame );
173
194
case REQUEST_N :
174
195
return handleRequestN (streamId , frame );
175
196
case REQUEST_STREAM :
176
- return doReceive (streamId , requestStream (frame ));
197
+ return doReceive (streamId , requestStream (frame ), RequestStream );
177
198
case FIRE_AND_FORGET :
178
199
return handleFireAndForget (streamId , fireAndForget (frame ));
179
200
case REQUEST_SUBSCRIPTION :
180
- return doReceive (streamId , requestSubscription (frame ));
201
+ return doReceive (streamId , requestSubscription (frame ), RequestStream );
181
202
case REQUEST_CHANNEL :
182
203
return handleChannel (streamId , frame );
183
204
case RESPONSE :
@@ -251,13 +272,14 @@ private synchronized void cleanup() {
251
272
requestHandler .close ().subscribe (Subscribers .empty ());
252
273
}
253
274
254
- private Publisher <Void > handleReceive (int streamId , Publisher <Payload > response ) {
275
+ private Publisher <Void > handleRequestResponse (int streamId , Publisher <Payload > response ) {
255
276
final Runnable cleanup = () -> {
256
277
synchronized (this ) {
257
278
subscriptions .remove (streamId );
258
279
}
259
280
260
281
};
282
+ long now = publishSingleFrameReceiveEvents (streamId , RequestResponse );
261
283
262
284
Px <Frame > frames =
263
285
Px
@@ -282,26 +304,29 @@ private Publisher<Void> handleReceive(int streamId, Publisher<Payload> response)
282
304
return Frame .Error .from (streamId , throwable );
283
305
});
284
306
285
- return Px .from (connection .send (frames ));
307
+ return Px .from (eventPublishingSocket . decorateSend ( streamId , connection .send (frames ), now , RequestResponse ));
286
308
287
309
}
288
310
289
- private Publisher <Void > doReceive (int streamId , Publisher <Payload > response ) {
311
+ private Publisher <Void > doReceive (int streamId , Publisher <Payload > response , RequestType requestType ) {
312
+ long now = publishSingleFrameReceiveEvents (streamId , requestType );
290
313
Px <Frame > resp = Px .from (response )
291
314
.map (payload -> Response .from (streamId , FrameType .RESPONSE , payload ));
292
315
RemoteSender sender = new RemoteSender (resp , () -> subscriptions .remove (streamId ), streamId , 2 );
293
316
subscriptions .put (streamId , sender );
294
- return connection .send (sender );
317
+ return eventPublishingSocket . decorateSend ( streamId , connection .send (sender ), now , requestType );
295
318
}
296
319
297
320
private Publisher <Void > handleChannel (int streamId , Frame firstFrame ) {
321
+ long now = publishSingleFrameReceiveEvents (streamId , RequestChannel );
298
322
int initialRequestN = Request .initialRequestN (firstFrame );
299
323
Frame firstAsNext = Request .from (streamId , FrameType .NEXT , firstFrame , initialRequestN );
300
324
RemoteReceiver receiver = new RemoteReceiver (connection , streamId , () -> removeChannelProcessor (streamId ),
301
325
firstAsNext , receiversSubscription , true );
302
326
channelProcessors .put (streamId , receiver );
303
327
304
- Px <Frame > response = Px .from (requestChannel (receiver ))
328
+ Px <Frame > response = Px .from (requestChannel (eventPublishingSocket .decorateReceive (streamId , receiver ,
329
+ RequestChannel )))
305
330
.map (payload -> Response .from (streamId , FrameType .RESPONSE , payload ));
306
331
307
332
RemoteSender sender = new RemoteSender (response , () -> removeSubscriptions (streamId ), streamId ,
@@ -310,7 +335,7 @@ private Publisher<Void> handleChannel(int streamId, Frame firstFrame) {
310
335
subscriptions .put (streamId , sender );
311
336
}
312
337
313
- return connection .send (sender );
338
+ return eventPublishingSocket . decorateSend ( streamId , connection .send (sender ), now , RequestChannel );
314
339
}
315
340
316
341
private Publisher <Void > handleFireAndForget (int streamId , Publisher <Void > result ) {
@@ -368,4 +393,14 @@ private synchronized void addSubscription(int streamId, Subscription subscriptio
368
393
private synchronized void removeSubscription (int streamId ) {
369
394
subscriptions .remove (streamId );
370
395
}
396
+
397
+ private long publishSingleFrameReceiveEvents (int streamId , RequestType requestType ) {
398
+ long now = Clock .now ();
399
+ if (eventPublisher .isEventPublishingEnabled ()) {
400
+ EventListener eventListener = eventPublisher .getEventListener ();
401
+ eventListener .requestReceiveStart (streamId , requestType );
402
+ eventListener .requestReceiveComplete (streamId , requestType , Clock .elapsedSince (now ), Clock .unit ());
403
+ }
404
+ return now ;
405
+ }
371
406
}
0 commit comments