Persistence API

The Persistence API provides an easy and fast way to store data. It supports two main storages, namely PersistentSequence and PersistentQueue.

PersistentSequence

PersistentSequence provides a functionality for storing sequential data (for example, logs). Each record should have a unique index. Indexer implementation is used to provide an index for a certain storing record. Also, PersistentSequence requires custom Serializer implementation to serialize objects to byte buffer and restore them back.

PersistenceFactory factory = ...

Indexer<MyRecord> indexer = new Indexer<MyRecord>() {
    @Override
    public long getIndex(MyRecord item) {
        return item.getId();
    }
};

Serializer<MyRecord> serializer = new Serializer<MyRecord>() {
    @Override
    public void serialize(MyRecord item, ElasticByteBuffer buffer) {
        // serialize instance ...
    }

    @Override
    public MyRecord deserialize(ElasticByteBuffer buffer, int length) {
        MyRecord record = new MyRecord;
        // load data to instance...
        return record;
    }
};

final PersistentSequence<MyRecord> sequence = factory.buildSequence("seq_sample", indexer, serializer);

//store record to sequence
sequence.append(record);

In addition to storing data, PersistentSequence provides methods for retrieving records from storage. It supports reading a single item by index or iterating through items:

//get single item with index 100
final MyRecord myRecord = sequence.get(100);

//iterate items from index 0 till 100
sequence.retrieveItems(0, 100, new RetrieveSequenceItemsListener<MyRecord>() {
    @Override
    public void onItem(long id, MyRecord record) {
        //...
    }
}, true);

There is a possibility to review stored records and remove some of them from storage:

sequence.cleanUp(new CleanupItemListener<MyRecord>() {
    @Override
    public boolean checkForClean(long id, MyRecord item) {
        //return true to removed this record from storage
        return false;
    }
});

Or remove all and reset the sequence:

//remove all items and reset index
sequence.reset();

The default PersistentSequence implementation is optimized for writing data, so reading operations may take a bit more time.

PersistentQueue

PersistentQueue works like a queue but persists all items to the disk. Thus, it can restore its state after application restart. PersistentQueue has methods similar to java.util.Queue:

final PersistentQueue<MyRecord> queue = factory.buildQueue("queue_sample", serializer);

//push item to the tail of queue
queue.add(record);

// read iem from head but doesn't remove
record = queue.peek();

// extract item from head and remove it from queue
record = queue.poll();

Also PersistentQueue allows iterating all its items:

queue.iterate(new RetrieveQueueItemsListener<MyRecord>() {
    @Override
    public void onItem(MyRecord record) {
        //....
    }
});

To remove all the items from the queue, you can use the clean method:

//remove all items and clean file
queue.clear();