Class InMemoryTokenStore
- All Implemented Interfaces:
TokenStore
TokenStore that stores tracking tokens in memory. This implementation is thread-safe.- Author:
- Rene de Waele, Christophe Bouhier
-
Constructor Summary
ConstructorsConstructorDescriptionNo-arg constructor for theInMemoryTokenStorewhich will log a warning on initialization. -
Method Summary
Modifier and TypeMethodDescriptionvoiddeleteToken(String processorName, int segment) Deletes the token for the processor with givenprocessorNameandsegment.int[]fetchSegments(String processorName) Returns an array of knownsegmentsfor a givenprocessorName.fetchToken(String processorName, int segment) voidinitializeSegment(TrackingToken token, String processorName, int segment) Initializes a segment with givensegmentfor the processor with givenprocessorNameto contain the giventoken.voidinitializeTokenSegments(String processorName, int segmentCount) Initializes the givensegmentCountnumber of segments for the givenprocessorNameto track its tokens.voidinitializeTokenSegments(String processorName, int segmentCount, TrackingToken initialToken) Initializes the givensegmentCountnumber of segments for the givenprocessorNameto track its tokens.voidreleaseClaim(String processorName, int segment) Release a claim of the token for givenprocessorNameandsegment.booleanIndicates whether this TokenStore instance requires segments to be explicitly initialized, before any tokens can be claimed for that segment.Returns a unique identifier that uniquely identifies the storage location of the tokens in this store.voidstoreToken(TrackingToken token, String processorName, int segment) Stores the giventokenin the store.Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitMethods inherited from interface org.axonframework.eventhandling.tokenstore.TokenStore
extendClaim, fetchAvailableSegments, fetchToken
-
Constructor Details
-
InMemoryTokenStore
public InMemoryTokenStore()No-arg constructor for theInMemoryTokenStorewhich will log a warning on initialization.
-
-
Method Details
-
initializeTokenSegments
public void initializeTokenSegments(@Nonnull String processorName, int segmentCount) throws UnableToClaimTokenException Description copied from interface:TokenStoreInitializes the givensegmentCountnumber of segments for the givenprocessorNameto track its tokens. This method should only be invoked when no tokens have been stored for the given processor, yet.This method will initialize the tokens, but not claim them. It will create the segments ranging from
0untilsegmentCount - 1.The exact behavior when this method is called while tokens were already present, is undefined in case the token already present is not owned by the initializing process.
- Specified by:
initializeTokenSegmentsin interfaceTokenStore- Parameters:
processorName- The name of the processor to initialize segments forsegmentCount- The number of segments to initialize- Throws:
UnableToClaimTokenException- when a segment has already been created
-
initializeTokenSegments
public void initializeTokenSegments(@Nonnull String processorName, int segmentCount, TrackingToken initialToken) throws UnableToClaimTokenException Description copied from interface:TokenStoreInitializes the givensegmentCountnumber of segments for the givenprocessorNameto track its tokens. This method should only be invoked when no tokens have been stored for the given processor, yet.This method will store
initialTokenfor all segments as starting point for processor, but not claim them. It will create the segments ranging from0untilsegmentCount - 1.The exact behavior when this method is called while tokens were already present, is undefined in case the token already present is not owned by the initializing process.
- Specified by:
initializeTokenSegmentsin interfaceTokenStore- Parameters:
processorName- The name of the processor to initialize segments forsegmentCount- The number of segments to initializeinitialToken- The initial token which is used as a starting point for processor- Throws:
UnableToClaimTokenException- when a segment has already been created
-
storeToken
Description copied from interface:TokenStoreStores the giventokenin the store. The token marks the current position of the process with givenprocessorNameandsegment. The giventokenmay benull. Any claims made by the current process have their timestamp updated.This method should throw an
UnableToClaimTokenExceptionwhen the givensegmenthas not been initialized with a Token (albeitnull) yet. In that case, a segment must have been explicitly initialized. A TokenStore implementation's ability to do so is exposed by theTokenStore.requiresExplicitSegmentInitialization()method. If that method returns false, this method may implicitly initialize a token and return that token upon invocation.- Specified by:
storeTokenin interfaceTokenStore- Parameters:
token- The token to store for a given process and segment. May benull.processorName- The name of the process for which to store the tokensegment- The index of the segment for which to store the token
-
fetchToken
Description copied from interface:TokenStoreReturns the last storedtokenfor the givenprocessorNameandsegment. Returnsnullif the stored token for the given process and segment isnull.This method should throw an
UnableToClaimTokenExceptionwhen the givensegmenthas not been initialized with a Token (albeitnull) yet. In that case, a segment must have been explicitly initialized. A TokenStore implementation's ability to do so is exposed by theTokenStore.requiresExplicitSegmentInitialization()method. If that method returns false, this method may implicitly initialize a token and return that token upon invocation.The token will be claimed by the current process (JVM instance), preventing access by other instances. To release the claim, use
TokenStore.releaseClaim(String, int)- Specified by:
fetchTokenin interfaceTokenStore- Parameters:
processorName- The process name for which to fetch the tokensegment- The segment index for which to fetch the token- Returns:
- The last stored TrackingToken or
nullif the store holds no token for given process and segment
-
releaseClaim
Description copied from interface:TokenStoreRelease a claim of the token for givenprocessorNameandsegment. If no such claim existed, nothing happens.The caller must ensure not to use any streams opened based on the token for which the claim is released.
- Specified by:
releaseClaimin interfaceTokenStore- Parameters:
processorName- The name of the process owning the token (e.g. a TrackingEventProcessor name)segment- the segment for which a token was obtained
-
deleteToken
public void deleteToken(@Nonnull String processorName, int segment) throws UnableToClaimTokenException Description copied from interface:TokenStoreDeletes the token for the processor with givenprocessorNameandsegment. The token must be owned by the current node, to be able to delete it.Implementations should implement this method only when
TokenStore.requiresExplicitSegmentInitialization()is overridden to returntrue. Deleting tokens using implementations that do not require explicit token initialization is unsafe, as a claim will automatically recreate the deleted token instance, which may result in concurrency issues.- Specified by:
deleteTokenin interfaceTokenStore- Parameters:
processorName- The name of the processor to remove the token forsegment- The segment to delete- Throws:
UnableToClaimTokenException- if the token is not currently claimed by this node
-
initializeSegment
public void initializeSegment(TrackingToken token, @Nonnull String processorName, int segment) throws UnableToInitializeTokenException Description copied from interface:TokenStoreInitializes a segment with givensegmentfor the processor with givenprocessorNameto contain the giventoken.This method fails if a Token already exists for the given processor and segment, even if that token has been claimed by the active instance.
This method will not claim the initialized segment. Use
TokenStore.fetchToken(String, int)to retrieve and claim the token.- Specified by:
initializeSegmentin interfaceTokenStore- Parameters:
token- The token to initialize the segment withprocessorName- The name of the processor to create the segment forsegment- The identifier of the segment to initialize- Throws:
UnableToInitializeTokenException- if a Token already exists
-
requiresExplicitSegmentInitialization
public boolean requiresExplicitSegmentInitialization()Description copied from interface:TokenStoreIndicates whether this TokenStore instance requires segments to be explicitly initialized, before any tokens can be claimed for that segment.- Specified by:
requiresExplicitSegmentInitializationin interfaceTokenStore- Returns:
trueif this instance requires tokens to be explicitly initialized, otherwisefalse.- See Also:
-
fetchSegments
Description copied from interface:TokenStoreReturns an array of knownsegmentsfor a givenprocessorName.The segments returned are segments for which a token has been stored previously. When the
TokenStoreis empty, an empty array is returned.- Specified by:
fetchSegmentsin interfaceTokenStore- Parameters:
processorName- The process name for which to fetch the segments- Returns:
- an array of segment identifiers.
-
retrieveStorageIdentifier
Description copied from interface:TokenStoreReturns a unique identifier that uniquely identifies the storage location of the tokens in this store. Two token store implementations that share state, must return the same identifier. Two token store implementations that do not share a location, must return a different identifier (or an empty optional if identifiers are not supported).Note that this method may require the implementation to consult its underlying storage. Therefore, a Transaction should be active when this method is called, similarly to invocations like
TokenStore.fetchToken(String, int),TokenStore.fetchSegments(String), etc. When no Transaction is active, the behavior is undefined.- Specified by:
retrieveStorageIdentifierin interfaceTokenStore- Returns:
- an identifier to uniquely identify the storage location of tokens in this TokenStore.
-