Class PersistentDispatcherMultipleConsumers
- java.lang.Object
-
- org.apache.pulsar.broker.service.AbstractBaseDispatcher
-
- org.apache.pulsar.broker.service.AbstractDispatcherMultipleConsumers
-
- org.apache.pulsar.broker.service.persistent.PersistentDispatcherMultipleConsumers
-
- All Implemented Interfaces:
org.apache.bookkeeper.mledger.AsyncCallbacks.ReadEntriesCallback,Dispatcher
- Direct Known Subclasses:
PersistentStickyKeyDispatcherMultipleConsumers,PersistentStreamingDispatcherMultipleConsumers
public class PersistentDispatcherMultipleConsumers extends AbstractDispatcherMultipleConsumers implements Dispatcher, org.apache.bookkeeper.mledger.AsyncCallbacks.ReadEntriesCallback
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description protected static classPersistentDispatcherMultipleConsumers.ReadType
-
Field Summary
Fields Modifier and Type Field Description protected static java.util.concurrent.atomic.AtomicIntegerFieldUpdater<PersistentDispatcherMultipleConsumers>BLOCKED_DISPATCHER_ON_UNACKMSG_UPDATERprotected org.apache.bookkeeper.mledger.ManagedCursorcursorprotected java.util.Optional<DispatchRateLimiter>dispatchRateLimiterprotected booleanhavePendingReadprotected booleanhavePendingReplayReadprotected com.google.common.collect.Range<org.apache.bookkeeper.mledger.impl.PositionImpl>lastIndividualDeletedRangeFromCursorRecoveryprotected org.apache.bookkeeper.mledger.impl.PositionImplminReplayedPositionprotected java.lang.Stringnameprotected intreadBatchSizeprotected org.apache.pulsar.client.impl.BackoffreadFailureBackoffprotected MessageRedeliveryControllerredeliveryMessagesprotected RedeliveryTrackerredeliveryTrackerprotected booleanshouldRewindBeforeReadingOrReplayingprotected PersistentTopictopicprotected static java.util.concurrent.atomic.AtomicIntegerFieldUpdater<PersistentDispatcherMultipleConsumers>TOTAL_AVAILABLE_PERMITS_UPDATERprotected inttotalAvailablePermitsprotected inttotalUnackedMessages-
Fields inherited from class org.apache.pulsar.broker.service.AbstractDispatcherMultipleConsumers
consumerList, consumerSet, currentConsumerRoundRobinIndex, FALSE, IS_CLOSED_UPDATER, TRUE
-
Fields inherited from class org.apache.pulsar.broker.service.AbstractBaseDispatcher
dispatchThrottlingOnBatchMessageEnabled, entryFilters, filterContext, serviceConfig, subscription
-
-
Constructor Summary
Constructors Constructor Description PersistentDispatcherMultipleConsumers(PersistentTopic topic, org.apache.bookkeeper.mledger.ManagedCursor cursor, Subscription subscription)PersistentDispatcherMultipleConsumers(PersistentTopic topic, org.apache.bookkeeper.mledger.ManagedCursor cursor, Subscription subscription, boolean allowOutOfOrderDelivery)
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description voidaddConsumer(Consumer consumer)protected booleanaddMessageToReplay(long ledgerId, long entryId)protected booleanaddMessageToReplay(long ledgerId, long entryId, long stickyKeyHash)voidaddUnAckedMessages(int numberOfMessages)protected java.util.Set<? extends org.apache.bookkeeper.mledger.Position>asyncReplayEntries(java.util.Set<? extends org.apache.bookkeeper.mledger.Position> positions)protected java.util.Set<? extends org.apache.bookkeeper.mledger.Position>asyncReplayEntriesInOrder(java.util.Set<? extends org.apache.bookkeeper.mledger.Position> positions)voidblockDispatcherOnUnackedMsgs()protected org.apache.commons.lang3.tuple.Pair<java.lang.Integer,java.lang.Long>calculateToRead(int currentTotalAvailablePermits)protected voidcancelPendingRead()booleancanUnsubscribe(Consumer consumer)booleancheckAndUnblockIfStuck()Checks if dispatcher is stuck and unblocks the dispatch if needed.voidclearDelayedMessages()java.util.concurrent.CompletableFuture<java.lang.Void>close()mark dispatcher closed to stop new incoming requests and disconnect all consumers.voidconsumerFlow(Consumer consumer, int additionalNumberOfMessages)Indicates that this consumer is now ready to receive more messages.voidcursorIsReset()java.util.concurrent.CompletableFuture<java.lang.Void>disconnectActiveConsumers(boolean isResetCursor)Disconnect active consumers.java.util.concurrent.CompletableFuture<java.lang.Void>disconnectAllConsumers(boolean isResetCursor)disconnect all consumers.java.util.concurrent.CopyOnWriteArrayList<Consumer>getConsumers()protected intgetFirstAvailableConsumerPermits()protected java.util.Set<org.apache.bookkeeper.mledger.impl.PositionImpl>getMessagesToReplayNow(int maxMessagesToRead)java.lang.StringgetName()longgetNumberOfDelayedMessages()java.util.Optional<DispatchRateLimiter>getRateLimiter()RedeliveryTrackergetRedeliveryTracker()protected intgetStickyKeyHash(org.apache.bookkeeper.mledger.Entry entry)PersistentTopicgetTopic()intgetTotalUnackedMessages()org.apache.pulsar.common.api.proto.CommandSubscribe.SubTypegetType()booleaninitializeDispatchRateLimiterIfNeeded()protected booleanisAtleastOneConsumerAvailable()returns true only ifAbstractDispatcherMultipleConsumers.consumerListhas atleast one unblocked consumer and have available permits.booleanisBlockedDispatcherOnUnackedMsgs()booleanisConsumerAvailable(Consumer consumer)booleanisConsumerConnected()protected booleanisConsumersExceededOnSubscription()Determine whether the number of consumers on the subscription reaches the threshold.voidreadEntriesComplete(java.util.List<org.apache.bookkeeper.mledger.Entry> entries, java.lang.Object ctx)voidreadEntriesFailed(org.apache.bookkeeper.mledger.ManagedLedgerException exception, java.lang.Object ctx)voidreadMoreEntries()voidredeliverUnacknowledgedMessages(Consumer consumer, long consumerEpoch)voidredeliverUnacknowledgedMessages(Consumer consumer, java.util.List<org.apache.bookkeeper.mledger.impl.PositionImpl> positions)voidremoveConsumer(Consumer consumer)protected voidreScheduleRead()voidreset()mark dispatcher open to serve new incoming requests.voidresetCloseFuture()protected voidsendMessagesToConsumers(PersistentDispatcherMultipleConsumers.ReadType readType, java.util.List<org.apache.bookkeeper.mledger.Entry> entries)protected booleanshouldPauseDeliveryForDelayTracker()booleantrackDelayedDelivery(long ledgerId, long entryId, org.apache.pulsar.common.api.proto.MessageMetadata msgMetadata)Check with dispatcher if the message should be added to the delayed delivery tracker.voidunBlockDispatcherOnUnackedMsgs()voidupdateRateLimiter()-
Methods inherited from class org.apache.pulsar.broker.service.AbstractDispatcherMultipleConsumers
getNextConsumer, getRandomConsumer, isClosed
-
Methods inherited from class org.apache.pulsar.broker.service.AbstractBaseDispatcher
computeReadLimits, filterEntriesForConsumer, filterEntriesForConsumer, isConsumersExceededOnSubscription, peekStickyKey, reachDispatchRateLimit, updateEntryWrapperWithMetadata, updateMessagesToRead
-
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
Methods inherited from interface org.apache.pulsar.broker.service.Dispatcher
disconnectAllConsumers, isClosed, markDeletePositionMoveForward
-
-
-
-
Field Detail
-
topic
protected final PersistentTopic topic
-
cursor
protected final org.apache.bookkeeper.mledger.ManagedCursor cursor
-
lastIndividualDeletedRangeFromCursorRecovery
protected volatile com.google.common.collect.Range<org.apache.bookkeeper.mledger.impl.PositionImpl> lastIndividualDeletedRangeFromCursorRecovery
-
redeliveryMessages
protected final MessageRedeliveryController redeliveryMessages
-
redeliveryTracker
protected final RedeliveryTracker redeliveryTracker
-
havePendingRead
protected volatile boolean havePendingRead
-
havePendingReplayRead
protected volatile boolean havePendingReplayRead
-
minReplayedPosition
protected volatile org.apache.bookkeeper.mledger.impl.PositionImpl minReplayedPosition
-
shouldRewindBeforeReadingOrReplaying
protected boolean shouldRewindBeforeReadingOrReplaying
-
name
protected final java.lang.String name
-
TOTAL_AVAILABLE_PERMITS_UPDATER
protected static final java.util.concurrent.atomic.AtomicIntegerFieldUpdater<PersistentDispatcherMultipleConsumers> TOTAL_AVAILABLE_PERMITS_UPDATER
-
totalAvailablePermits
protected volatile int totalAvailablePermits
-
readBatchSize
protected volatile int readBatchSize
-
readFailureBackoff
protected final org.apache.pulsar.client.impl.Backoff readFailureBackoff
-
totalUnackedMessages
protected volatile int totalUnackedMessages
-
BLOCKED_DISPATCHER_ON_UNACKMSG_UPDATER
protected static final java.util.concurrent.atomic.AtomicIntegerFieldUpdater<PersistentDispatcherMultipleConsumers> BLOCKED_DISPATCHER_ON_UNACKMSG_UPDATER
-
dispatchRateLimiter
protected java.util.Optional<DispatchRateLimiter> dispatchRateLimiter
-
-
Constructor Detail
-
PersistentDispatcherMultipleConsumers
public PersistentDispatcherMultipleConsumers(PersistentTopic topic, org.apache.bookkeeper.mledger.ManagedCursor cursor, Subscription subscription)
-
PersistentDispatcherMultipleConsumers
public PersistentDispatcherMultipleConsumers(PersistentTopic topic, org.apache.bookkeeper.mledger.ManagedCursor cursor, Subscription subscription, boolean allowOutOfOrderDelivery)
-
-
Method Detail
-
addConsumer
public void addConsumer(Consumer consumer) throws BrokerServiceException
- Specified by:
addConsumerin interfaceDispatcher- Throws:
BrokerServiceException
-
isConsumersExceededOnSubscription
protected boolean isConsumersExceededOnSubscription()
Description copied from class:AbstractBaseDispatcherDetermine whether the number of consumers on the subscription reaches the threshold.- Specified by:
isConsumersExceededOnSubscriptionin classAbstractBaseDispatcher- Returns:
-
removeConsumer
public void removeConsumer(Consumer consumer) throws BrokerServiceException
- Specified by:
removeConsumerin interfaceDispatcher- Throws:
BrokerServiceException
-
consumerFlow
public void consumerFlow(Consumer consumer, int additionalNumberOfMessages)
Description copied from interface:DispatcherIndicates that this consumer is now ready to receive more messages.- Specified by:
consumerFlowin interfaceDispatcher
-
readMoreEntries
public void readMoreEntries()
-
reScheduleRead
protected void reScheduleRead()
- Specified by:
reScheduleReadin classAbstractBaseDispatcher
-
calculateToRead
protected org.apache.commons.lang3.tuple.Pair<java.lang.Integer,java.lang.Long> calculateToRead(int currentTotalAvailablePermits)
-
asyncReplayEntries
protected java.util.Set<? extends org.apache.bookkeeper.mledger.Position> asyncReplayEntries(java.util.Set<? extends org.apache.bookkeeper.mledger.Position> positions)
-
asyncReplayEntriesInOrder
protected java.util.Set<? extends org.apache.bookkeeper.mledger.Position> asyncReplayEntriesInOrder(java.util.Set<? extends org.apache.bookkeeper.mledger.Position> positions)
-
isConsumerConnected
public boolean isConsumerConnected()
- Specified by:
isConsumerConnectedin interfaceDispatcher- Overrides:
isConsumerConnectedin classAbstractDispatcherMultipleConsumers
-
getConsumers
public java.util.concurrent.CopyOnWriteArrayList<Consumer> getConsumers()
- Specified by:
getConsumersin interfaceDispatcher- Overrides:
getConsumersin classAbstractDispatcherMultipleConsumers
-
canUnsubscribe
public boolean canUnsubscribe(Consumer consumer)
- Specified by:
canUnsubscribein interfaceDispatcher- Overrides:
canUnsubscribein classAbstractDispatcherMultipleConsumers
-
close
public java.util.concurrent.CompletableFuture<java.lang.Void> close()
Description copied from interface:Dispatchermark dispatcher closed to stop new incoming requests and disconnect all consumers.- Specified by:
closein interfaceDispatcher- Returns:
-
disconnectAllConsumers
public java.util.concurrent.CompletableFuture<java.lang.Void> disconnectAllConsumers(boolean isResetCursor)
Description copied from interface:Dispatcherdisconnect all consumers.- Specified by:
disconnectAllConsumersin interfaceDispatcher- Returns:
-
cancelPendingRead
protected void cancelPendingRead()
- Overrides:
cancelPendingReadin classAbstractDispatcherMultipleConsumers
-
disconnectActiveConsumers
public java.util.concurrent.CompletableFuture<java.lang.Void> disconnectActiveConsumers(boolean isResetCursor)
Description copied from interface:DispatcherDisconnect active consumers.- Specified by:
disconnectActiveConsumersin interfaceDispatcher
-
resetCloseFuture
public void resetCloseFuture()
- Specified by:
resetCloseFuturein interfaceDispatcher- Overrides:
resetCloseFuturein classAbstractBaseDispatcher
-
reset
public void reset()
Description copied from interface:Dispatchermark dispatcher open to serve new incoming requests.- Specified by:
resetin interfaceDispatcher
-
getType
public org.apache.pulsar.common.api.proto.CommandSubscribe.SubType getType()
- Specified by:
getTypein interfaceDispatcher- Overrides:
getTypein classAbstractDispatcherMultipleConsumers
-
readEntriesComplete
public void readEntriesComplete(java.util.List<org.apache.bookkeeper.mledger.Entry> entries, java.lang.Object ctx)- Specified by:
readEntriesCompletein interfaceorg.apache.bookkeeper.mledger.AsyncCallbacks.ReadEntriesCallback
-
sendMessagesToConsumers
protected void sendMessagesToConsumers(PersistentDispatcherMultipleConsumers.ReadType readType, java.util.List<org.apache.bookkeeper.mledger.Entry> entries)
-
readEntriesFailed
public void readEntriesFailed(org.apache.bookkeeper.mledger.ManagedLedgerException exception, java.lang.Object ctx)- Specified by:
readEntriesFailedin interfaceorg.apache.bookkeeper.mledger.AsyncCallbacks.ReadEntriesCallback
-
isAtleastOneConsumerAvailable
protected boolean isAtleastOneConsumerAvailable()
returns true only ifAbstractDispatcherMultipleConsumers.consumerListhas atleast one unblocked consumer and have available permits.- Returns:
-
getFirstAvailableConsumerPermits
protected int getFirstAvailableConsumerPermits()
-
isConsumerAvailable
public boolean isConsumerAvailable(Consumer consumer)
- Specified by:
isConsumerAvailablein classAbstractDispatcherMultipleConsumers
-
redeliverUnacknowledgedMessages
public void redeliverUnacknowledgedMessages(Consumer consumer, long consumerEpoch)
- Specified by:
redeliverUnacknowledgedMessagesin interfaceDispatcher
-
redeliverUnacknowledgedMessages
public void redeliverUnacknowledgedMessages(Consumer consumer, java.util.List<org.apache.bookkeeper.mledger.impl.PositionImpl> positions)
- Specified by:
redeliverUnacknowledgedMessagesin interfaceDispatcher
-
addUnAckedMessages
public void addUnAckedMessages(int numberOfMessages)
- Specified by:
addUnAckedMessagesin interfaceDispatcher
-
isBlockedDispatcherOnUnackedMsgs
public boolean isBlockedDispatcherOnUnackedMsgs()
-
blockDispatcherOnUnackedMsgs
public void blockDispatcherOnUnackedMsgs()
-
unBlockDispatcherOnUnackedMsgs
public void unBlockDispatcherOnUnackedMsgs()
-
getTotalUnackedMessages
public int getTotalUnackedMessages()
-
getName
public java.lang.String getName()
-
getRedeliveryTracker
public RedeliveryTracker getRedeliveryTracker()
- Specified by:
getRedeliveryTrackerin interfaceDispatcher
-
getRateLimiter
public java.util.Optional<DispatchRateLimiter> getRateLimiter()
- Specified by:
getRateLimiterin interfaceDispatcher
-
updateRateLimiter
public void updateRateLimiter()
- Specified by:
updateRateLimiterin interfaceDispatcher
-
initializeDispatchRateLimiterIfNeeded
public boolean initializeDispatchRateLimiterIfNeeded()
- Specified by:
initializeDispatchRateLimiterIfNeededin interfaceDispatcher
-
trackDelayedDelivery
public boolean trackDelayedDelivery(long ledgerId, long entryId, org.apache.pulsar.common.api.proto.MessageMetadata msgMetadata)Description copied from interface:DispatcherCheck with dispatcher if the message should be added to the delayed delivery tracker. Return true if the message should be delayed and ignored at this point.- Specified by:
trackDelayedDeliveryin interfaceDispatcher
-
getMessagesToReplayNow
protected java.util.Set<org.apache.bookkeeper.mledger.impl.PositionImpl> getMessagesToReplayNow(int maxMessagesToRead)
-
shouldPauseDeliveryForDelayTracker
protected boolean shouldPauseDeliveryForDelayTracker()
-
getNumberOfDelayedMessages
public long getNumberOfDelayedMessages()
- Specified by:
getNumberOfDelayedMessagesin interfaceDispatcher
-
clearDelayedMessages
public void clearDelayedMessages()
- Specified by:
clearDelayedMessagesin interfaceDispatcher
-
cursorIsReset
public void cursorIsReset()
- Specified by:
cursorIsResetin interfaceDispatcher
-
addMessageToReplay
protected boolean addMessageToReplay(long ledgerId, long entryId, long stickyKeyHash)
-
addMessageToReplay
protected boolean addMessageToReplay(long ledgerId, long entryId)
-
checkAndUnblockIfStuck
public boolean checkAndUnblockIfStuck()
Description copied from interface:DispatcherChecks if dispatcher is stuck and unblocks the dispatch if needed.- Specified by:
checkAndUnblockIfStuckin interfaceDispatcher
-
getTopic
public PersistentTopic getTopic()
-
getStickyKeyHash
protected int getStickyKeyHash(org.apache.bookkeeper.mledger.Entry entry)
-
-