This sample demonstrates how to use a pluggable session storage.
Source code
PluggableStorage.cpp:
#include "MySessionStorage.h"
#include "../Settings/Defaults.h"
#include "../Common/Helpers.h"
#include "../Common/Listener.h"
#include "../Common/Settings.h"
#include "../Common/Signal.h"
#include "../Common/Emulator.h"
using namespace Samples;
int main(int argc, char* argv[])
{
const AppConfiguration<SettingsConfiguration, ConnectivityConfiguration, LogonConfiguration> cfg{"PluggableStorage", argc, argv};
try
{
SignalHelper::manageSignals();
auto settings = fillSettings(cfg);
const auto emulator = createEmulator(settings, cfg);
const auto bgwCredentials = receiveBgwCredentials(settings, cfg.host(), cfg.port());
MySessionStorage storage;
Listener listener;
settings.ipSessionToken(bgwCredentials.ipSessionToken);
Session bgwSession(SessionType::BGW, settings, &listener, SessionStorageType::Pluggable, &storage);
bgwSession.connect(bgwCredentials.host, bgwCredentials.port);
bgwSession.send(Helper::createTraderLogonRequest(cfg.traderId(), cfg.traderPwd()));
Samples::wait(listener.traderLoggedOn).get();
bgwSession.send(Helper::createOrder(cfg.traderId()));
SignalHelper::waitUntilKey("disconnect the BGW session and terminate the application");
bgwSession.send(Helper::createTraderLogoutRequest(cfg.traderId())).disconnect();
}
catch (const std::exception& ex)
{
std::cerr << "EXCEPTION: " << ex.what() << std::endl;
return 1;
}
return 0;
}
MySessionStorage.cpp:
#include "MySessionStorage.h"
#include "../Common/Helpers.h"
#include "../Common/Listener.h"
namespace Samples {
namespace {
const char* begin(const NetworkMessage message) noexcept
{
return static_cast<const char*>(message.data());
}
const char* end(const NetworkMessage message) noexcept
{
return static_cast<const char*
>(
advanceByBytes(message.data(), message.size()));
}
void storeMessage(MySessionStorage::Messages & storage, const NetworkMessage message)
{
storage.push_back(MySessionStorage::Message(begin(message), end(message)));
throw std::runtime_error("Unknown message type");
}
}
MySessionStorage::MySessionStorage():
inSeqNum_(1),
outSeqNum_(1),
id_(std::to_string(IdGenerator::newId())),
terminated_(false),
sessionCreationTime_()
{}
void MySessionStorage::close(bool doBackup)
{
std::clog << "\nClose the session storage (doBackup=" << doBackup << ").\n";
inSeqNum_ = 1;
outSeqNum_ = 1;
terminated_ = false;
inboundMessages_.clear();
outboundMessages_.clear();
}
const std::string & MySessionStorage::id() const
{
return id_;
}
{
return inSeqNum_;
}
void MySessionStorage::inSeqNum(SeqNumber msgSeqNum)
{
std::clog << "\nSet inSeqNum to " << msgSeqNum << ".\n";
inSeqNum_ = msgSeqNum;
}
SeqNumber MySessionStorage::outSeqNum()
const
{
return outSeqNum_;
}
void MySessionStorage::outSeqNum(SeqNumber msgSeqNum)
{
std::clog << "\nSet outSeqNum to " << msgSeqNum << ".\n";
outSeqNum_ = msgSeqNum;
}
Timestamp MySessionStorage::sessionCreationTime() const
{
return sessionCreationTime_;
}
void MySessionStorage::sessionCreationTime(Timestamp time)
{
std::clog << "\nSet sessionCreationTime to " << time << "\n";
sessionCreationTime_ = time;
}
void MySessionStorage::storeInboundMessage(const NetworkMessage message, SeqNumber msgSeqNum, Timestamp)
{
std::clog << "\nStore inbound message:\n";
storeMessage(inboundMessages_, message);
inSeqNum_ = msgSeqNum;
}
void MySessionStorage::storeOutboundMessage(const NetworkMessage message, SeqNumber msgSeqNum, Timestamp)
{
std::clog << "\nStore outbound message:\n";
storeMessage(outboundMessages_, message);
outSeqNum_ = msgSeqNum;
}
void MySessionStorage::flush()
{
}
void MySessionStorage::warmup(size_t, Timestamp)
{
}
}
MySessionStorage.h:
#include <vector>
#include <list>
namespace Samples {
class MySessionStorage final : public SessionStorage
{
public:
MySessionStorage();
const std::string & id() const override;
void inSeqNum(SeqNumber msgSeqNum) override;
void outSeqNum(SeqNumber msgSeqNum) override;
Timestamp sessionCreationTime() const override;
void sessionCreationTime(Timestamp) override;
void close(bool doBackup = false) override;
void storeInboundMessage(const NetworkMessage message, SeqNumber msgSeqNum, Timestamp messageReceivingUtcTimestamp = Timestamp()) override;
void storeOutboundMessage(const NetworkMessage message, SeqNumber msgSeqNum, Timestamp messageSendingUtcTimestamp = Timestamp()) override;
void flush() override;
void warmup(size_t, Timestamp) override;
typedef std::list<Message> Messages;
private:
std::string id_;
bool terminated_;
Timestamp sessionCreationTime_;
Messages inboundMessages_;
Messages outboundMessages_;
};
}