public class ResequencerEngine<E> extends Object
SequenceElementComparator. This resequencer is designed for
resequencing element streams. Stream-based resequencing has the advantage that the number of elements to be
resequenced need not be known in advance. Resequenced elements are delivered via a SequenceSender.
The resequencer's behaviour for a given comparator is controlled by the timeout property. This is the
timeout (in milliseconds) for a given element managed by this resequencer. An out-of-sequence element can only be
marked as ready-for-delivery if it either times out or if it has an immediate predecessor (in that case it is
in-sequence). If an immediate predecessor of a waiting element arrives the timeout task for the waiting element will
be cancelled (which marks it as ready-for-delivery).
If the maximum out-of-sequence time difference between elements within a stream is known, the timeout
value should be set to this value. In this case it is guaranteed that all elements of a stream will be delivered in
sequence via the SequenceSender. The lower the timeout value is compared to the out-of-sequence
time difference between elements within a stream the higher the probability is for out-of-sequence elements delivered
by this resequencer. Delivery of elements must be explicitly triggered by applications using the deliver()
or deliverNext() methods. Only elements that are ready-for-delivery are delivered by these methods.
The longer an application waits to trigger a delivery the more elements may become ready-for-delivery.
The resequencer remembers the last-delivered element. If an element arrives which is the immediate successor of the
last-delivered element it is ready-for-delivery immediately. After delivery the last-delivered element is
adjusted accordingly. If the last-delivered element is null i.e. the resequencer was newly created the
first arriving element needs timeout milliseconds in any case for becoming ready-for-delivery.
| Constructor and Description |
|---|
ResequencerEngine(SequenceElementComparator<E> comparator)
Creates a new resequencer instance with a default timeout of 2000 milliseconds.
|
| Modifier and Type | Method and Description |
|---|---|
void |
deliver()
Delivers all elements which are currently ready to deliver.
|
boolean |
deliverNext()
Attempts to deliver a single element from the head of the resequencer queue (sequence).
|
Boolean |
getRejectOld() |
SequenceSender<E> |
getSequenceSender()
Returns the sequence sender.
|
long |
getTimeout()
Returns this resequencer's timeout value.
|
void |
insert(E o)
Inserts the given element into this resequencer.
|
void |
setRejectOld(Boolean rejectOld) |
void |
setSequenceSender(SequenceSender<E> sequenceSender)
Sets the sequence sender.
|
void |
setTimeout(long timeout)
Sets this sequencer's timeout value.
|
int |
size()
Returns the number of elements currently maintained by this resequencer.
|
void |
start() |
void |
stop()
Stops this resequencer (i.e.
|
public ResequencerEngine(SequenceElementComparator<E> comparator)
comparator - a sequence element comparator.public void start()
public void stop()
Timer instance).public int size()
public long getTimeout()
public void setTimeout(long timeout)
timeout - the timeout in milliseconds.public Boolean getRejectOld()
public void setRejectOld(Boolean rejectOld)
public SequenceSender<E> getSequenceSender()
public void setSequenceSender(SequenceSender<E> sequenceSender)
sequenceSender - a sequence element sender.public void insert(E o)
o - an element.IllegalArgumentException - if the element cannot be used with this resequencer enginepublic void deliver()
throws Exception
Exception - thrown by SequenceSender.sendElement(Object).deliverNext()public boolean deliverNext()
throws Exception
SequenceSender.sendElement(Object).true if the element has been delivered false otherwise.Exception - thrown by SequenceSender.sendElement(Object).Apache Camel