Class PersistentDispatcherMultipleConsumers
java.lang.Object
org.apache.pulsar.broker.service.EntryFilterSupport
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 ClassesModifier and TypeClassDescriptionprotected static enum -
Field Summary
FieldsModifier and TypeFieldDescriptionprotected static final AtomicIntegerFieldUpdater<PersistentDispatcherMultipleConsumers>protected final org.apache.bookkeeper.mledger.ManagedCursorprotected final ExecutorServiceprotected Optional<DispatchRateLimiter>protected booleanprotected booleanprotected com.google.common.collect.Range<org.apache.bookkeeper.mledger.impl.PositionImpl>protected org.apache.bookkeeper.mledger.impl.PositionImplprotected final Stringprotected intprotected final org.apache.pulsar.client.impl.Backoffprotected final MessageRedeliveryControllerprotected final RedeliveryTrackerprotected booleanprotected booleanprotected final PersistentTopicprotected static final AtomicIntegerFieldUpdater<PersistentDispatcherMultipleConsumers>protected intprotected intFields inherited from class org.apache.pulsar.broker.service.AbstractDispatcherMultipleConsumers
consumerList, consumerSet, currentConsumerRoundRobinIndex, FALSE, IS_CLOSED_UPDATER, TRUEFields inherited from class org.apache.pulsar.broker.service.AbstractBaseDispatcher
dispatchThrottlingOnBatchMessageEnabled, serviceConfigFields inherited from class org.apache.pulsar.broker.service.EntryFilterSupport
entryFilters, filterContext, subscription -
Constructor Summary
ConstructorsConstructorDescriptionPersistentDispatcherMultipleConsumers(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
Modifier and TypeMethodDescriptionvoidaddConsumer(Consumer consumer) protected booleanaddMessageToReplay(long ledgerId, long entryId) protected booleanaddMessageToReplay(long ledgerId, long entryId, long stickyKeyHash) voidaddUnAckedMessages(int numberOfMessages) protected Set<? extends org.apache.bookkeeper.mledger.Position>asyncReplayEntries(Set<? extends org.apache.bookkeeper.mledger.Position> positions) protected Set<? extends org.apache.bookkeeper.mledger.Position>asyncReplayEntriesInOrder(Set<? extends org.apache.bookkeeper.mledger.Position> positions) voidcalculateToRead(int currentTotalAvailablePermits) protected voidbooleancanUnsubscribe(Consumer consumer) booleanChecks if dispatcher is stuck and unblocks the dispatch if needed.voidclose()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.voiddisconnectActiveConsumers(boolean isResetCursor) Disconnect active consumers.disconnectAllConsumers(boolean isResetCursor) disconnect all consumers.longprotected intprotected Set<org.apache.bookkeeper.mledger.impl.PositionImpl>getMessagesToReplayNow(int maxMessagesToRead) getName()longprotected intgetStickyKeyHash(org.apache.bookkeeper.mledger.Entry entry) getTopic()intorg.apache.pulsar.common.api.proto.CommandSubscribe.SubTypegetType()booleanprotected booleanreturns true only ifAbstractDispatcherMultipleConsumers.consumerListhas atleast one unblocked consumer and have available permits.booleanbooleanisConsumerAvailable(Consumer consumer) booleanprotected booleanDetermine whether the number of consumers on the subscription reaches the threshold.final voidreadEntriesComplete(List<org.apache.bookkeeper.mledger.Entry> entries, Object ctx) voidreadEntriesFailed(org.apache.bookkeeper.mledger.ManagedLedgerException exception, Object ctx) voidvoidWe should not call readMoreEntries() recursively in the same thread as there is a risk of StackOverflowError.voidredeliverUnacknowledgedMessages(Consumer consumer, long consumerEpoch) voidredeliverUnacknowledgedMessages(Consumer consumer, List<org.apache.bookkeeper.mledger.impl.PositionImpl> positions) voidremoveConsumer(Consumer consumer) protected voidvoidreset()mark dispatcher open to serve new incoming requests.voidprotected final booleansendMessagesToConsumers(PersistentDispatcherMultipleConsumers.ReadType readType, List<org.apache.bookkeeper.mledger.Entry> entries) protected booleanbooleantrackDelayedDelivery(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.protected booleantrySendMessagesToConsumers(PersistentDispatcherMultipleConsumers.ReadType readType, List<org.apache.bookkeeper.mledger.Entry> entries) Dispatch the messages to the Consumers.voidvoidMethods inherited from class org.apache.pulsar.broker.service.AbstractDispatcherMultipleConsumers
getNextConsumer, getRandomConsumer, isClosedMethods inherited from class org.apache.pulsar.broker.service.AbstractBaseDispatcher
computeReadLimits, filterEntriesForConsumer, filterEntriesForConsumer, getFilterAcceptedMsgCount, getFilterProcessedMsgCount, getFilterRejectedMsgCount, getFilterRescheduledMsgCount, getSubscriptionName, isConsumersExceededOnSubscription, peekStickyKey, reachDispatchRateLimit, updateMessagesToRead, updatePendingBytesToDispatchMethods inherited from class org.apache.pulsar.broker.service.EntryFilterSupport
runFiltersForEntryMethods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitMethods inherited from interface org.apache.pulsar.broker.service.Dispatcher
disconnectAllConsumers, getFilterAcceptedMsgCount, getFilterProcessedMsgCount, getFilterRejectedMsgCount, getFilterRescheduledMsgCount, isClosed, markDeletePositionMoveForward
-
Field Details
-
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
-
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
-
sendInProgress
protected boolean sendInProgress -
TOTAL_AVAILABLE_PERMITS_UPDATER
protected static final 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 AtomicIntegerFieldUpdater<PersistentDispatcherMultipleConsumers> BLOCKED_DISPATCHER_ON_UNACKMSG_UPDATER -
dispatchRateLimiter
-
dispatchMessagesThread
-
-
Constructor Details
-
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 Details
-
addConsumer
- 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
- Specified by:
removeConsumerin interfaceDispatcher- Throws:
BrokerServiceException
-
consumerFlow
Description copied from interface:DispatcherIndicates that this consumer is now ready to receive more messages.- Specified by:
consumerFlowin interfaceDispatcher
-
readMoreEntriesAsync
public void readMoreEntriesAsync()We should not call readMoreEntries() recursively in the same thread as there is a risk of StackOverflowError. -
readMoreEntries
public void readMoreEntries() -
reScheduleRead
protected void reScheduleRead()- Specified by:
reScheduleReadin classAbstractBaseDispatcher
-
calculateToRead
-
asyncReplayEntries
-
asyncReplayEntriesInOrder
-
isConsumerConnected
public boolean isConsumerConnected()- Specified by:
isConsumerConnectedin interfaceDispatcher- Overrides:
isConsumerConnectedin classAbstractDispatcherMultipleConsumers
-
getConsumers
- Specified by:
getConsumersin interfaceDispatcher- Overrides:
getConsumersin classAbstractDispatcherMultipleConsumers
-
canUnsubscribe
- Specified by:
canUnsubscribein interfaceDispatcher- Overrides:
canUnsubscribein classAbstractDispatcherMultipleConsumers
-
close
Description copied from interface:Dispatchermark dispatcher closed to stop new incoming requests and disconnect all consumers.- Specified by:
closein interfaceDispatcher- Returns:
-
disconnectAllConsumers
Description copied from interface:Dispatcherdisconnect all consumers.- Specified by:
disconnectAllConsumersin interfaceDispatcher- Returns:
-
cancelPendingRead
protected void cancelPendingRead()- Overrides:
cancelPendingReadin classAbstractDispatcherMultipleConsumers
-
disconnectActiveConsumers
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 final void readEntriesComplete(List<org.apache.bookkeeper.mledger.Entry> entries, Object ctx) - Specified by:
readEntriesCompletein interfaceorg.apache.bookkeeper.mledger.AsyncCallbacks.ReadEntriesCallback
-
sendMessagesToConsumers
protected final boolean sendMessagesToConsumers(PersistentDispatcherMultipleConsumers.ReadType readType, List<org.apache.bookkeeper.mledger.Entry> entries) -
trySendMessagesToConsumers
protected boolean trySendMessagesToConsumers(PersistentDispatcherMultipleConsumers.ReadType readType, List<org.apache.bookkeeper.mledger.Entry> entries) Dispatch the messages to the Consumers.- Returns:
- true if you want to trigger a new read. This method is overridden by other classes, please take a look to other implementations if you need to change it.
-
readEntriesFailed
public void readEntriesFailed(org.apache.bookkeeper.mledger.ManagedLedgerException exception, 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
- Specified by:
isConsumerAvailablein classAbstractDispatcherMultipleConsumers
-
redeliverUnacknowledgedMessages
- Specified by:
redeliverUnacknowledgedMessagesin interfaceDispatcher
-
redeliverUnacknowledgedMessages
public void redeliverUnacknowledgedMessages(Consumer consumer, 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
-
getRedeliveryTracker
- Specified by:
getRedeliveryTrackerin interfaceDispatcher
-
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 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
-
getDelayedTrackerMemoryUsage
public long getDelayedTrackerMemoryUsage() -
getStickyKeyHash
protected int getStickyKeyHash(org.apache.bookkeeper.mledger.Entry entry)
-