After going through the EMA documentation, I am not sure if EMA is providing any mechanism to
maintain a cached image and applying updates to it.
We used to do it using only
a few lines of code in RFA MarketData. We are subscribing to market price service. In RFA MarketData code we maintain a cached
full image in a TibMsg object.
TibMsg m_RawImage;
We populate the TibMsg object when we get an initial image
from the RFA callback using the following code:
void ProcessItemImage(const MarketDataItemEvent& event)
{
const rfa::common::Buffer& buffer = event.getBuffer();
switch (event.getDataFormat())
{
case MarketDataEnums::Marketfeed:
if (!buffer.isEmpty())
{
TibMsg msg;
TibErr err = msg.UnPack((char*)buffer.c_buf(), buffer.size());
assert(err.code == TIBMSG_OK);
CopyTibMsg(m_RawImage, msg);
.
.
.
When we get a update message callback from RFA we apply the update
to the cached full image using the following code:
void ProcessItemUpdate(const MarketDataItemEvent& event)
{
const rfa::common::Buffer& buffer = event.getBuffer();
switch (event.getDataFormat())
{
case MarketDataEnums::Marketfeed:
if (!buffer.isEmpty())
{
TibMsg msg;
TibErr err = msg.UnPack((char*)buffer.c_buf(), buffer.size());
assert(err.code == TIBMSG_OK);
if (err.code != TIBMSG_OK)
return;
UpdateTibMsg(m_RawImage, msg);
.
.
}
bool UpdateTibMsg(TibMsg& image, TibMsg& delta)
{
TibField field;
bool ret = false;
for (field.First(δ); field.status==TIBMSG_OK; field.Next())
{
TibErr err = image.Update(&field);
ret |= (err.code == TIBMSG_OK);
}
return ret;
}
What is the equivalent thing to do in EMA? What object
can we cache?
The documentation clearly says this:
Warning! The Data class and all classes that inherit from it are designed as temporary
and short-lived objects. For this reason, do not use them as storage
or caching devices.
Do we need to implement our own classes for caching and
applying updates?