...
Declaring
ConnectionFactory
in Spring and inject it inSimpleJmsContextFactory
:Code Block language xml <bean id="jmsConfigRegister" class="com.epam.fej.jms.DefaultJmsConfigsRegister" p:jmsManager-ref="jmsAdaptorManager" p:jmsContextFactory-ref="jmsContextFactory" c:config-ref="jmsConfig" init-method="init"/> <bean id="jmsConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory" c:brokerURL-ref="${jms.broker.url}"/> <bean id="jmsContextFactory" class="com.epam.fej.jms.SimpleJmsContextFactory" c:connectionFactory-ref="jmsConnectionFactory"/>
Implement your own
JmsContextFactory
and pass it as a parameter forDefaultJmsConfigRegister
:Code Block language java public class ActiveMqJmsContextFactory implements JmsContextFactory { @Override public JMSContext createContext(JmsConfig config) { return new SimpleJmsContext(new ActiveMQConnectionFactory( config.getConnectionInfo().getProviderURL()), config.getConnectionInfo()); } }
Code Block language xml <bean id="activeMqContextFactory" class="com.epam.fej.jms.ActiveMqJmsContextFactory"/> <bean id="jmsConfigRegister" class="com.epam.fej.jms.DefaultJmsConfigsRegister" p:jmsManager-ref="jmsAdaptorManager" p:jmsContextFactory-ref="activeMqContextFactory" c:config-ref="jmsConfig" init-method="init"/>
Persistence API
Persistent API provides easy and fast way to storing data. It support two main storages: PersistentSequence
and PersistentQueue
.
PersistentSequence
PersistentSequence
provides functionality for storing sequential data (for example, logs). Each record should have unique index. Indexer
implementation is used to provide index for certain storing record. Also PersistentSequence
requires custom Serializer
implementation to serialize objects to byte buffer and restore it back.
Code Block | ||
---|---|---|
| ||
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 additional to storing data PersistentSequence
provides methods for retrieving records from storage. It supports reading single item by index or iterating through items:
Code Block | ||
---|---|---|
| ||
//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:
Code Block | ||
---|---|---|
| ||
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 sequence:
Code Block | ||
---|---|---|
| ||
//remove all items and reset index
sequence.reset(); |
Default PersistentSequence
implementation is optimized for writing data and reading operations may take a bit more time.