61
61
import java .util .Set ;
62
62
import java .util .UUID ;
63
63
import java .util .concurrent .ConcurrentHashMap ;
64
+ import java .util .concurrent .Executor ;
65
+ import java .util .concurrent .ExecutorService ;
64
66
import java .util .concurrent .ScheduledExecutorService ;
65
67
import java .util .concurrent .TimeUnit ;
66
68
import java .util .concurrent .atomic .AtomicBoolean ;
@@ -97,6 +99,7 @@ final class StreamingSubscriberConnection extends AbstractApiService implements
97
99
private final String subscription ;
98
100
private final SubscriptionName subscriptionNameObject ;
99
101
private final ScheduledExecutorService systemExecutor ;
102
+ private final ExecutorService eodAckCallbackExecutor ;
100
103
private final MessageDispatcher messageDispatcher ;
101
104
102
105
private final FlowControlSettings flowControlSettings ;
@@ -128,6 +131,7 @@ private StreamingSubscriberConnection(Builder builder) {
128
131
subscription = builder .subscription ;
129
132
subscriptionNameObject = SubscriptionName .parse (builder .subscription );
130
133
systemExecutor = builder .systemExecutor ;
134
+ eodAckCallbackExecutor = builder .eodAckCallbackExecutor ;
131
135
132
136
// We need to set the default stream ack deadline on the initial request, this will be
133
137
// updated by modack requests in the message dispatcher
@@ -455,7 +459,7 @@ private void sendAckOperations(
455
459
.setSubscription (subscription )
456
460
.addAllAckIds (ackIdsInRequest )
457
461
.build ());
458
- ApiFutures .addCallback (ackFuture , callback , directExecutor ());
462
+ ApiFutures .addCallback (ackFuture , callback , getCallbackExecutor ());
459
463
pendingOperations ++;
460
464
}
461
465
ackOperationsWaiter .incrementPendingCount (pendingOperations );
@@ -504,7 +508,7 @@ private void sendModackOperations(
504
508
.addAllAckIds (ackIdsInRequest )
505
509
.setAckDeadlineSeconds (modackRequestData .getDeadlineExtensionSeconds ())
506
510
.build ());
507
- ApiFutures .addCallback (modackFuture , callback , directExecutor ());
511
+ ApiFutures .addCallback (modackFuture , callback , getCallbackExecutor ());
508
512
pendingOperations ++;
509
513
}
510
514
}
@@ -716,6 +720,13 @@ public void run() {
716
720
};
717
721
}
718
722
723
+ private Executor getCallbackExecutor () {
724
+ if (!getExactlyOnceDeliveryEnabled ()) {
725
+ return directExecutor ();
726
+ }
727
+ return eodAckCallbackExecutor ;
728
+ }
729
+
719
730
/** Builder of {@link StreamingSubscriberConnection StreamingSubscriberConnections}. */
720
731
public static final class Builder {
721
732
private MessageReceiver receiver ;
@@ -736,6 +747,7 @@ public static final class Builder {
736
747
private boolean useLegacyFlowControl ;
737
748
private ScheduledExecutorService executor ;
738
749
private ScheduledExecutorService systemExecutor ;
750
+ private ExecutorService eodAckCallbackExecutor ;
739
751
private ApiClock clock ;
740
752
741
753
private boolean enableOpenTelemetryTracing ;
@@ -826,6 +838,11 @@ public Builder setSystemExecutor(ScheduledExecutorService systemExecutor) {
826
838
return this ;
827
839
}
828
840
841
+ public Builder setEodAckCallbackExecutor (ExecutorService eodAckCallbackExecutor ) {
842
+ this .eodAckCallbackExecutor = eodAckCallbackExecutor ;
843
+ return this ;
844
+ }
845
+
829
846
public Builder setClock (ApiClock clock ) {
830
847
this .clock = clock ;
831
848
return this ;
0 commit comments