E
- the type of events.public class IndexedEventModel<E extends IndexedEvent<?>> extends AbstractIndexedEventModel<E,AbstractIndexedEventModel.Entry<E>>
IndexedEvent
class and
arranges incoming events into a list
ordered by
their source
id
and index
. Note, that TimeSeriesEvent
extends IndexedEvent
in
such a way, that this ordering also orders time-series event by time
. However,
there is a time-series aware class TimeSeriesEventModel
that provides a more convenient way to
subscribe to time-series.
The model must be configured with symbol
to subscribe for and
attached
to a DXFeed
instance to start operation.
The view of the current list of events is available via getEventsList
method.
Model change notifications are provided via addListener
method of this list. It accepts an instance of ObservableListModelListener
class.
Users of this model only see the list of events in a consistent state. This model delays incoming events which
are part of incomplete snapshot or ongoing transaction until snapshot is complete or transaction has ended.
These pending events cannot be seen neither via list nor via listener calls, and so
eventFlags
of events in the model are set to zero.
The eventFlags are only used and must be taken into account when processing indexed events directly via low-level
DXFeedSubscription
class.
Note, that it is not of much use to arrange Order
events by their index
,
so there is a dedicated OrderBookModel
that arranges buy and sell orders separately by their price.
dxFeed API comes with a set of samples. DXFeedTimeAndSales
sample is a very simple UI application
that shows how to use this model with TimeAndSale
event, for example, concentrating your
effort on data representation logic, while delegating all the data-handling logic to this model.
It also showcases some of the advanced methods of this model like setSizeLimit
.
The convenient way to detach model from the feed is to call its close
method. Closed model
becomes permanently detached from all feeds, removes all its listeners and is guaranteed to be reclaimable by
the garbage collector as soon as all external references to it are cleared.
attach
, detach
and close
.
You must query the state of attached
model only from
inside of the notification invocations or from within the thread that performs
those notifications.
Installed ObservableListModelListener
instances are invoked from a separate thread via the executor.
Default executor for all models is configured with DXEndpoint.executor
method. Each model can individually override its executor with setExecutor
method. The corresponding
modelChanged
notification is guaranteed to never be concurrent, even though it may happen from different
threads if executor is multi-threaded.
In practice, it means that is UI applications you must
install UI-thread-bound execution to your DXEndpoint
via
DXEndpoint.executor
method, so that you
can freely use all methods of this model from UI thread.
Custom executor can be used by backend applications that do not need to immediately update this model on
arrival of new events, but want to update the model at a later time, for example, from inside of a servlet request.
This approach is explained with code samples in
Threads and locks
section of DXFeedSubscription
class documentation.
AbstractIndexedEventModel.Entry<V>
Constructor and Description |
---|
IndexedEventModel(Class<? extends E> eventType)
Creates new model.
|
Modifier and Type | Method and Description |
---|---|
void |
close()
Closes this model and makes it permanently detached.
|
protected AbstractIndexedEventModel.Entry<E> |
createEntry()
Creates new concrete entry to represent an event in this model.
|
ObservableListModel<E> |
getEventsList()
Returns the view of the current list of events in this model.
|
protected void |
modelChanged(List<AbstractIndexedEventModel.Entry<E>> changedEntries)
Invoked on the change of this model.
|
attach, clear, detach, entryListIterator, get, getExecutor, getSizeLimit, getSymbol, isClosed, isSnapshotEnd, listIterator, listIterator, setExecutor, setSizeLimit, setSymbol, size
public IndexedEventModel(Class<? extends E> eventType)
AbstractIndexedEventModel.setSymbol(java.lang.Object)
to specify subscription symbol and
AbstractIndexedEventModel.attach(com.dxfeed.api.DXFeed)
method to specify feed to start receiving events.eventType
- the event type.NullPointerException
- if event type is null.public void close()
This method ensures that model can be safely garbage-collected when all outside references to it are lost.
close
in interface AutoCloseable
close
in class AbstractIndexedEventModel<E extends IndexedEvent<?>,AbstractIndexedEventModel.Entry<E extends IndexedEvent<?>>>
public ObservableListModel<E> getEventsList()
protected AbstractIndexedEventModel.Entry<E> createEntry()
This implementation creates an new instance of AbstractIndexedEventModel.Entry
.
createEntry
in class AbstractIndexedEventModel<E extends IndexedEvent<?>,AbstractIndexedEventModel.Entry<E extends IndexedEvent<?>>>
protected void modelChanged(List<AbstractIndexedEventModel.Entry<E>> changedEntries)
changedEntries
list
have changed
flag set to true
and the new values of
incoming events are available via Entry.getNewValue
method.
The changed flags is cleared
after return from this method by Entry.commitChange
method, which can also
be invoked during this method, if needed.
This implementation commits
all changes and invokes
ObservableListModelListener.modelChanged
on all installed listeners.
modelChanged
in class AbstractIndexedEventModel<E extends IndexedEvent<?>,AbstractIndexedEventModel.Entry<E extends IndexedEvent<?>>>
changedEntries
- the list of changed entries.Copyright © 2002–2023 Devexperts LLC. All rights reserved.