@@ -143,7 +143,7 @@ public Flux<OutboundMessageResult> sendWithPublishConfirms(Publisher<OutboundMes
143143 final Mono <? extends Channel > currentChannelMono = getChannelMono (options );
144144 final BiConsumer <SignalType , Channel > channelCloseHandler = getChannelCloseHandler (options );
145145
146- return currentChannelMono .map (channel -> {
146+ Flux < OutboundMessageResult > result = currentChannelMono .map (channel -> {
147147 try {
148148 channel .confirmSelect ();
149149 } catch (IOException e ) {
@@ -162,6 +162,11 @@ public Flux<OutboundMessageResult> sendWithPublishConfirms(Publisher<OutboundMes
162162 channelCloseThreadPool .execute (() -> channelCloseHandler .accept (signalType , channel ));
163163 }
164164 }));
165+
166+ if (sendOptions .getMaxInFlight () != null ) {
167+ result = result .publishOn (sendOptions .getScheduler (), sendOptions .getMaxInFlight ());
168+ }
169+ return result ;
165170 }
166171
167172 // package-protected for testing
@@ -520,11 +525,11 @@ public void subscribe(CoreSubscriber<? super OutboundMessageResult> actual) {
520525 }
521526
522527 private static class PublishConfirmSubscriber implements
523- CoreSubscriber <OutboundMessage > {
528+ CoreSubscriber <OutboundMessage >, Subscription {
524529
525530 private final AtomicReference <SubscriberState > state = new AtomicReference <>(SubscriberState .INIT );
526531
527- private final AtomicReference <Throwable > firstException = new AtomicReference <Throwable >();
532+ private final AtomicReference <Throwable > firstException = new AtomicReference <>();
528533
529534 private final ConcurrentNavigableMap <Long , OutboundMessage > unconfirmed = new ConcurrentSkipListMap <>();
530535
@@ -534,54 +539,69 @@ private static class PublishConfirmSubscriber implements
534539
535540 private final BiConsumer <SendContext , Exception > exceptionHandler ;
536541
542+ private Subscription subscription ;
543+
537544 private PublishConfirmSubscriber (Channel channel , Subscriber <? super OutboundMessageResult > subscriber , SendOptions options ) {
538545 this .channel = channel ;
539546 this .subscriber = subscriber ;
540547 this .exceptionHandler = options .getExceptionHandler ();
541548 }
542549
550+ @ Override
551+ public void request (long n ) {
552+ subscription .request (n );
553+ }
554+
555+ @ Override
556+ public void cancel () {
557+ subscription .cancel ();
558+ }
559+
543560 @ Override
544561 public void onSubscribe (Subscription subscription ) {
545- channel .addConfirmListener (new ConfirmListener () {
562+ if (Operators .validate (this .subscription , subscription )) {
563+ channel .addConfirmListener (new ConfirmListener () {
546564
547- @ Override
548- public void handleAck (long deliveryTag , boolean multiple ) {
549- handleAckNack (deliveryTag , multiple , true );
550- }
565+ @ Override
566+ public void handleAck (long deliveryTag , boolean multiple ) {
567+ handleAckNack (deliveryTag , multiple , true );
568+ }
551569
552- @ Override
553- public void handleNack (long deliveryTag , boolean multiple ) {
554- handleAckNack (deliveryTag , multiple , false );
555- }
570+ @ Override
571+ public void handleNack (long deliveryTag , boolean multiple ) {
572+ handleAckNack (deliveryTag , multiple , false );
573+ }
556574
557- private void handleAckNack (long deliveryTag , boolean multiple , boolean ack ) {
558- if (multiple ) {
559- try {
560- ConcurrentNavigableMap <Long , OutboundMessage > unconfirmedToSend = unconfirmed .headMap (deliveryTag , true );
561- Iterator <Map .Entry <Long , OutboundMessage >> iterator = unconfirmedToSend .entrySet ().iterator ();
562- while (iterator .hasNext ()) {
563- subscriber .onNext (new OutboundMessageResult (iterator .next ().getValue (), ack ));
564- iterator .remove ();
575+ private void handleAckNack (long deliveryTag , boolean multiple , boolean ack ) {
576+ if (multiple ) {
577+ try {
578+ ConcurrentNavigableMap <Long , OutboundMessage > unconfirmedToSend = unconfirmed .headMap (deliveryTag , true );
579+ Iterator <Map .Entry <Long , OutboundMessage >> iterator = unconfirmedToSend .entrySet ().iterator ();
580+ while (iterator .hasNext ()) {
581+ subscriber .onNext (new OutboundMessageResult (iterator .next ().getValue (), ack ));
582+ iterator .remove ();
583+ }
584+ } catch (Exception e ) {
585+ handleError (e , null );
586+ }
587+ } else {
588+ OutboundMessage outboundMessage = unconfirmed .get (deliveryTag );
589+ try {
590+ unconfirmed .remove (deliveryTag );
591+ subscriber .onNext (new OutboundMessageResult (outboundMessage , ack ));
592+ } catch (Exception e ) {
593+ handleError (e , new OutboundMessageResult (outboundMessage , ack ));
565594 }
566- } catch (Exception e ) {
567- handleError (e , null );
568595 }
569- } else {
570- OutboundMessage outboundMessage = unconfirmed .get (deliveryTag );
571- try {
572- unconfirmed .remove (deliveryTag );
573- subscriber .onNext (new OutboundMessageResult (outboundMessage , ack ));
574- } catch (Exception e ) {
575- handleError (e , new OutboundMessageResult (outboundMessage , ack ));
596+ if (unconfirmed .size () == 0 ) {
597+ maybeComplete ();
576598 }
577599 }
578- if (unconfirmed .size () == 0 ) {
579- maybeComplete ();
580- }
581- }
582- });
583- state .set (SubscriberState .ACTIVE );
584- subscriber .onSubscribe (subscription );
600+ });
601+ state .set (SubscriberState .ACTIVE );
602+ this .subscription = subscription ;
603+ subscriber .onSubscribe (this );
604+ }
585605 }
586606
587607 @ Override
0 commit comments