Demonstrates the minimal end-to-end workflow: create a Feed Engine, configure a Handler (network interface, logging, license and connectivity configuration), bind it to the Feed Engine, attach event tracers, subscribe to a market and start receiving market data. It also shows how to manage POSIX signals in a dedicated thread on Linux.
#include "../Common/Defaults.h"
#include "../Common/ExchangeEventTracer.h"
#include "../Common/FeedEventTracer.h"
#include "../Common/MarketDataEventTracer.h"
#include "../Common/ServiceEventTracer.h"
#include "../Common/Utils.h"
#ifndef _WIN32
# include <pthread.h>
# include <csignal>
# include <cstdio>
# include <vector>
#endif
#include <cstdlib>
#ifndef _WIN32
void manageLinuxSignals();
#endif
int main(int , char** )
{
try
{
#ifndef _WIN32
manageLinuxSignals();
#endif
introduceMyself("Getting Started");
handler.bindFeedEngine(feedEngine);
ServiceEventTracer serviceEventTracer;
serviceEventTracer.attachTo(handler);
FeedEventTracer feedEventTracer;
feedEventTracer.attachTo(handler);
ExchangeEventTracer exchangeEventTracer;
exchangeEventTracer.attachTo(handler);
MarketDataEventTracer marketDataEventTracer;
marketDataEventTracer.attachTo(handler);
);
subscriptions.insert(brentFutures);
handler.start(subscriptions);
readUserResponse();
std::cout << "Shutdown the Handler..." << std::endl;
handler.stop();
std::cout << "Done." << std::endl;
}
catch (const std::exception& ex)
{
std::cerr << "Error: " << ex.what() << std::endl;
return EXIT_FAILURE;
}
catch (...)
{
std::cerr << "Unknown exception." << std::endl;
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
#ifndef _WIN32
typedef std::vector<int> SuppressedSignals;
SuppressedSignals suppressedSignals;
sigset_t signalSet;
void errorAbort(int status, const char* reason)
{
printf("Aborted due to status %d: %s\n", status, reason ? reason : "no error message");
exit(1);
}
void* signalWaiter(void*)
{
int signalNumber;
while (1)
{
sigwait(&signalSet, &signalNumber);
printf("Signal %d received and suppressed.\n", signalNumber);
}
return NULL;
}
void manageLinuxSignals()
{
suppressedSignals.push_back(SIGPIPE);
pthread_t signalThreadId;
int status;
sigemptyset(&signalSet);
for (SuppressedSignals::const_iterator i = suppressedSignals.begin(), e = suppressedSignals.end(); i != e; ++i)
{
sigaddset(&signalSet, *i);
}
status = pthread_sigmask(SIG_BLOCK, &signalSet, NULL);
if (status != 0)
{
errorAbort(status, "Set signal mask");
}
status = pthread_create(&signalThreadId, NULL, signalWaiter, NULL);
if (status != 0)
{
errorAbort(status, "Create signalWaiter");
}
}
#endif