public final class MultiProducerSequencer extends AbstractSequencer
Coordinator for claiming sequences for access to a data structure while tracking dependent Sequence
s.
Suitable for use for sequencing across multiple publisher threads.
* Note on Cursored.getCursor()
: With this sequencer the cursor value is updated after the call
to Sequenced.next()
, to determine the highest available sequence that can be read, then
Sequencer.getHighestPublishedSequence(long, long)
should be used.
INITIAL_CURSOR_VALUE
Constructor and Description |
---|
MultiProducerSequencer(int bufferSize,
WaitStrategy waitStrategy)
Construct a Sequencer with the selected wait strategy and buffer size.
|
Modifier and Type | Method and Description |
---|---|
void |
claim(long sequence)
Claim a specific sequence.
|
long |
getHighestPublishedSequence(long lowerBound,
long availableSequence)
Get the highest sequence number that can be safely read from the ring buffer.
|
boolean |
hasAvailableCapacity(int requiredCapacity)
Has the buffer got capacity to allocate another sequence.
|
boolean |
isAvailable(long sequence)
Confirms if a sequence is published and the event is available for use; non-blocking.
|
long |
next()
Claim the next event in sequence for publishing.
|
long |
next(int n)
Claim the next n events in sequence for publishing.
|
void |
publish(long sequence)
Publishes a sequence.
|
void |
publish(long lo,
long hi)
Batch publish sequences.
|
long |
remainingCapacity()
Get the remaining capacity for this sequencer.
|
long |
tryNext()
Attempt to claim the next event in sequence for publishing.
|
long |
tryNext(int n)
Attempt to claim the next n events in sequence for publishing.
|
addGatingSequences, getBufferSize, getCursor, getMinimumSequence, newBarrier, newPoller, removeGatingSequence, toString
public MultiProducerSequencer(int bufferSize, WaitStrategy waitStrategy)
bufferSize
- the size of the buffer that this will sequence over.waitStrategy
- for those waiting on sequences.public boolean hasAvailableCapacity(int requiredCapacity)
Sequenced
requiredCapacity
- in the bufferSequenced.hasAvailableCapacity(int)
public void claim(long sequence)
Sequencer
sequence
- The sequence to initialise too.Sequencer.claim(long)
public long next()
Sequenced
Sequenced.next()
public long next(int n)
Sequenced
int n = 10; long hi = sequencer.next(n); long lo = hi - (n - 1); for (long sequence = lo; sequence <= hi; sequence++) { // Do work. } sequencer.publish(lo, hi);
n
- the number of sequences to claimSequenced.next(int)
public long tryNext() throws InsufficientCapacityException
Sequenced
requiredCapacity
slots
available.InsufficientCapacityException
- thrown if there is no space available in the ring buffer.Sequenced.tryNext()
public long tryNext(int n) throws InsufficientCapacityException
Sequenced
requiredCapacity
slots
available. Have a look at Sequenced.next()
for a description on how to
use this method.n
- the number of sequences to claimInsufficientCapacityException
- thrown if there is no space available in the ring buffer.Sequenced.tryNext(int)
public long remainingCapacity()
Sequenced
Sequenced.remainingCapacity()
public void publish(long sequence)
Sequenced
sequence
- the sequence to be published.Sequenced.publish(long)
public void publish(long lo, long hi)
Sequenced
lo
- first sequence number to publishhi
- last sequence number to publishSequenced.publish(long, long)
public boolean isAvailable(long sequence)
Sequencer
sequence
- of the buffer to checkSequencer.isAvailable(long)
public long getHighestPublishedSequence(long lowerBound, long availableSequence)
Sequencer
>= nextSequence
the return value will be
nextSequence - 1
. To work correctly a consumer should pass a value that
is 1 higher than the last sequence that was successfully processed.lowerBound
- The sequence to start scanning from.availableSequence
- The sequence to scan to.nextSequence - 1
.Copyright © 2011 - 2021 LMAX Ltd. All Rights Reserved.