53
53
import reactor .core .publisher .FluxSink ;
54
54
import reactor .core .publisher .Mono ;
55
55
import reactor .core .publisher .Operators ;
56
+ import reactor .core .publisher .Sinks ;
56
57
import reactor .core .scheduler .Schedulers ;
57
58
import reactor .netty .Connection ;
58
59
import reactor .netty .resources .LoopResources ;
88
89
*
89
90
* @see TcpClient
90
91
*/
91
- @ SuppressWarnings ("deprecation" )
92
92
public final class ReactorNettyClient implements Client {
93
93
94
94
private static final Logger logger = Loggers .getLogger (ReactorNettyClient .class );
@@ -107,11 +107,9 @@ public final class ReactorNettyClient implements Client {
107
107
108
108
private ConnectionContext context ;
109
109
110
- private final reactor . core . publisher . EmitterProcessor <Publisher <FrontendMessage >> requestProcessor = reactor . core . publisher . EmitterProcessor . create ( false );
110
+ private final Sinks . Many <Publisher <FrontendMessage >> requestSink = Sinks . many (). unicast (). onBackpressureBuffer ( );
111
111
112
- private final FluxSink <Publisher <FrontendMessage >> requests = this .requestProcessor .sink ();
113
-
114
- private final reactor .core .publisher .DirectProcessor <NotificationResponse > notificationProcessor = reactor .core .publisher .DirectProcessor .create ();
112
+ private final Sinks .Many <NotificationResponse > notificationProcessor = Sinks .many ().multicast ().directBestEffort ();
115
113
116
114
private final AtomicBoolean isClosed = new AtomicBoolean (false );
117
115
@@ -143,7 +141,7 @@ private ReactorNettyClient(Connection connection, ConnectionSettings settings) {
143
141
this .settings = Assert .requireNonNull (settings , "ConnectionSettings must not be null" );
144
142
145
143
connection .addHandler (new LengthFieldBasedFrameDecoder (Integer .MAX_VALUE - 5 , 1 , 4 , -4 , 0 ));
146
- connection .addHandler (new EnsureSubscribersCompleteChannelHandler (this .requestProcessor ));
144
+ connection .addHandler (new EnsureSubscribersCompleteChannelHandler (this .requestSink ));
147
145
this .connection = connection ;
148
146
this .byteBufAllocator = connection .outbound ().alloc ();
149
147
this .context = new ConnectionContext ().withChannelId (connection .channel ().toString ());
@@ -166,7 +164,7 @@ private ReactorNettyClient(Connection connection, ConnectionSettings settings) {
166
164
})
167
165
.subscribe (this .messageSubscriber );
168
166
169
- Mono <Void > request = this .requestProcessor
167
+ Mono <Void > request = this .requestSink . asFlux ()
170
168
.concatMap (Function .identity ())
171
169
.flatMap (message -> {
172
170
if (DEBUG_ENABLED ) {
@@ -186,9 +184,7 @@ private ReactorNettyClient(Connection connection, ConnectionSettings settings) {
186
184
public Mono <Void > close () {
187
185
return Mono .defer (() -> {
188
186
189
- if (!this .notificationProcessor .isTerminated ()) {
190
- this .notificationProcessor .onComplete ();
191
- }
187
+ this .notificationProcessor .tryEmitComplete ();
192
188
193
189
drainError (EXPECTED );
194
190
@@ -221,20 +217,20 @@ public Flux<BackendMessage> exchange(Predicate<BackendMessage> takeUntil, Publis
221
217
Assert .requireNonNull (takeUntil , "takeUntil must not be null" );
222
218
Assert .requireNonNull (requests , "requests must not be null" );
223
219
224
- return this .messageSubscriber .addConversation (takeUntil , requests , this .requests :: next , this ::isConnected );
220
+ return this .messageSubscriber .addConversation (takeUntil , requests , it -> this .requestSink . emitNext ( it , Sinks . EmitFailureHandler . FAIL_FAST ) , this ::isConnected );
225
221
}
226
222
227
223
@ Override
228
224
public void send (FrontendMessage message ) {
229
225
Assert .requireNonNull (message , "requests must not be null" );
230
226
231
- this .requests . next (Mono .just (message ));
227
+ this .requestSink . emitNext (Mono .just (message ), Sinks . EmitFailureHandler . FAIL_FAST );
232
228
}
233
229
234
230
private Mono <Void > resumeError (Throwable throwable ) {
235
231
236
232
handleConnectionError (throwable );
237
- this .requestProcessor . onComplete ( );
233
+ this .requestSink . emitComplete ( Sinks . EmitFailureHandler . FAIL_FAST );
238
234
239
235
if (isSslException (throwable )) {
240
236
logger .debug (this .context .getMessage ("Connection Error" ), throwable );
@@ -291,7 +287,7 @@ private boolean consumeMessage(BackendMessage message) {
291
287
}
292
288
293
289
if (message .getClass () == NotificationResponse .class ) {
294
- this .notificationProcessor .onNext ((NotificationResponse ) message );
290
+ this .notificationProcessor .tryEmitNext ((NotificationResponse ) message );
295
291
return true ;
296
292
}
297
293
@@ -423,12 +419,13 @@ private static Mono<? extends Void> registerSslHandler(SSLConfig sslConfig, Conn
423
419
424
420
@ Override
425
421
public Disposable addNotificationListener (Consumer <NotificationResponse > consumer ) {
426
- return this .notificationProcessor .subscribe (consumer );
422
+ return this .notificationProcessor .asFlux (). subscribe (consumer );
427
423
}
428
424
429
425
@ Override
426
+ @ SuppressWarnings ("deprecation" )
430
427
public Disposable addNotificationListener (Subscriber <NotificationResponse > consumer ) {
431
- return this .notificationProcessor .subscribe (consumer ::onNext , consumer ::onError , consumer ::onComplete , consumer ::onSubscribe );
428
+ return this .notificationProcessor .asFlux (). subscribe (consumer ::onNext , consumer ::onError , consumer ::onComplete , consumer ::onSubscribe );
432
429
}
433
430
434
431
@ Override
@@ -467,10 +464,6 @@ public boolean isConnected() {
467
464
return false ;
468
465
}
469
466
470
- if (this .requestProcessor .isDisposed ()) {
471
- return false ;
472
- }
473
-
474
467
Channel channel = this .connection .channel ();
475
468
return channel .isOpen ();
476
469
}
@@ -513,17 +506,15 @@ private void drainError(Supplier<? extends Throwable> supplier) {
513
506
514
507
this .messageSubscriber .close (supplier );
515
508
516
- if (!this .notificationProcessor .isTerminated ()) {
517
- this .notificationProcessor .onError (supplier .get ());
518
- }
509
+ this .notificationProcessor .tryEmitError (supplier .get ());
519
510
}
520
511
521
512
private final class EnsureSubscribersCompleteChannelHandler extends ChannelDuplexHandler {
522
513
523
- private final reactor . core . publisher . EmitterProcessor < Publisher < FrontendMessage >> requestProcessor ;
514
+ private final Sinks . Many <?> requestSink ;
524
515
525
- private EnsureSubscribersCompleteChannelHandler (reactor . core . publisher . EmitterProcessor < Publisher < FrontendMessage >> requestProcessor ) {
526
- this .requestProcessor = requestProcessor ;
516
+ private EnsureSubscribersCompleteChannelHandler (Sinks . Many <?> requestSink ) {
517
+ this .requestSink = requestSink ;
527
518
}
528
519
529
520
@ Override
@@ -535,7 +526,7 @@ public void channelInactive(ChannelHandlerContext ctx) throws Exception {
535
526
public void channelUnregistered (ChannelHandlerContext ctx ) throws Exception {
536
527
super .channelUnregistered (ctx );
537
528
538
- this .requestProcessor . onComplete ( );
529
+ this .requestSink . emitComplete ( Sinks . EmitFailureHandler . FAIL_FAST );
539
530
handleClose ();
540
531
}
541
532
@@ -870,7 +861,7 @@ public void onError(Throwable throwable) {
870
861
}
871
862
872
863
handleConnectionError (throwable );
873
- ReactorNettyClient .this .requestProcessor . onComplete ( );
864
+ ReactorNettyClient .this .requestSink . emitComplete ( Sinks . EmitFailureHandler . FAIL_FAST );
874
865
this .terminated = true ;
875
866
876
867
if (isSslException (throwable )) {
0 commit comments