Files
2024-09-23 12:00:04 -04:00

285 lines
9.6 KiB
C++

/*
* Copyright Onix Solutions Limited [OnixS]. All rights reserved.
*
* This software owned by Onix Solutions Limited [OnixS] and is protected by copyright law
* and international copyright treaties.
*
* Access to and use of the software is governed by the terms of the applicable OnixS Software
* Services Agreement (the Agreement) and Customer end user license agreements granting
* a non-assignable, non-transferable and non-exclusive license to use the software
* for it's own data processing purposes under the terms defined in the Agreement.
*
* Except as otherwise granted within the terms of the Agreement, copying or reproduction of any part
* of this source code or associated reference material to any other location for further reproduction
* or redistribution, and any amendments to this copyright notice, are expressly prohibited.
*
* Any reproduction or redistribution for sale or hiring of the Software not in accordance with
* the terms of the Agreement is a violation of copyright law.
*/
#pragma once
#include <string>
#include <set>
#include <OnixS/FIXEngine/ABI.h>
#include <OnixS/FIXEngine/Threading/Thread.h>
namespace OnixS {
namespace FIX {
ONIXS_FIXENGINE_API_DECL(class, Session);
namespace Scheduling {
ONIXS_FIXENGINE_API_DECL(class, SessionScheduler);
ONIXS_FIXENGINE_API_DECL(class, SessionSchedule);
ONIXS_FIXENGINE_API_DECL(class, SessionConnectionSettings);
ONIXS_FIXENGINE_API_DECL(class, Counterparty);
typedef std::string SessionScheduleId;
typedef std::string SessionConnectionSettingsId;
/// SessionScheduler events notifications.
class
ONIXS_FIXENGINE_API
SessionSchedulerListener
{
public:
/// Notifies if the FIX session is about to be closed.
/// @param scheduler Identifies an instance of the session
/// scheduler which is about to close the scheduled session.
/// @param session Identifies the session which is about to be closed.
/// @param allowLogout Defines whether the session
/// scheduler must perform the logout. To prohibit
/// the session logout it's necessary to set it to 'false'.
virtual
void
onLoggingOut(
const SessionScheduler & scheduler,
Session * session,
bool * allowLogout) = 0;
/// Allows scheduler's users to be notified when an initiator will try
/// to connect to the next counterparty.
/// The parameter `Counterparty` provides a counterparty,
/// to which the session will connect.
virtual
void
onInitiatorConnecting(
const SessionScheduler &,
Session *,
const Counterparty &) {}
/// Notifies about a non-critical issue occurred
/// while maintaining the state for the given session.
virtual
void
onWarning(
const SessionScheduler & scheduler,
Session * session,
const std::string & warningReason) = 0;
/// Notifies about an error occurred while
/// maintaining the state for the given session.
virtual
void
onError(
const SessionScheduler & scheduler,
Session * session,
const std::string & errorReason) = 0;
protected:
/// The class is not used for the object life time managing.
/// Therefore, destructor is in the protected area.
virtual ~SessionSchedulerListener() ONIXS_FIXENGINE_DEFAULT;
};
/// The way in which the Scheduler will utilize threads.
struct SchedulerThreadingModel
{
enum Enum
{
/// Scheduler will use its own threads.
DedicatedThreads,
/// Scheduler events are handled by rolling an event loop in a user thread.
ExternalThread
};
/// Returns the textual representation of the SchedulerThreadingModel::Enum value.
ONIXS_FIXENGINE_API static const char * toString(SchedulerThreadingModel::Enum value);
};
/// The collection of miscellaneous parameters
/// which affect the session scheduler behavior.
class
ONIXS_FIXENGINE_API
SessionSchedulerOptions
{
public:
/// Initializes parameters with default values.
SessionSchedulerOptions();
/// Cleans everything up.
~SessionSchedulerOptions();
/// The path to the scheduler configuration file.
const std::string & configurationFile() const;
/// Updates the path to the scheduler configuration file.
void configurationFile(const std::string & file);
/// An instance of the event listener to notify about events.
SessionSchedulerListener * eventListener() const;
/// Associates the given event listener with the scheduler.
void eventListener(SessionSchedulerListener * listener);
/// The threading model.
SchedulerThreadingModel::Enum threadingModel() const;
/// Updates the threading model.
void threadingModel(SchedulerThreadingModel::Enum threadingModel);
private:
std::string * configurationFile_;
SessionSchedulerListener * eventListener_;
SchedulerThreadingModel::Enum threadingModel_;
};
/// The scheduler performs the session connection maintenance according
/// to the specified schedule for session activities. It monitors
/// whenever criteria to log a particular session, either on or off,
/// is triggered and automatically executes an appropriate action.
class ONIXS_FIXENGINE_API SessionScheduler
{
public:
/// Initializes the Scheduler instance according to the options
/// specified in the given configuration file.
///
/// If specified, the Scheduler extracts from the configuration a set
/// of predefined session schedules and connection settings later
/// available through Schedules and ConnectionSettings properties.
SessionScheduler(
const SessionSchedulerOptions & options);
/// Performs the graceful shutdown of scheduling services.
~SessionScheduler();
/// Looks for the predefined session schedule
/// associated with the given unique names (ids) as it
/// was specified in the Scheduler's configuration file.
/// @return NULL if no a schedule available under the given id.
const
SessionSchedule *
findSchedule(const SessionScheduleId & id) const;
/// Looks for the predefined session connection settings
/// associated with the given unique names (ids) as it was
/// specified in the Scheduler's configuration file.
/// @return NULL if no settings available under the given id.
const
SessionConnectionSettings *
findConnectionSettings(
const SessionConnectionSettingsId & id) const;
/// Adds the session to the automatic connection management.
///
/// If the session is added during an active time frame,
/// it will be connected immediately. If the session is
/// registered during an inactive time frame and has an active state,
/// it will be disconnected. If the session is already registered,
/// an exception will be thrown.
///
/// @param session An instance of the session to be maintained.
/// @param schedule The schedule which defines the session connection
/// time, periodicity as well as other attributes.
/// @param connection Settings for the given session to
/// be used when the session must be connected.
void
add(
Session * session,
const SessionSchedule & schedule,
const SessionConnectionSettings & connection);
/// Adds the session to the automatic connection management.
///
/// If the session is added during an active time frame,
/// it will be connected immediately. If the session is
/// registered during an inactive time frame and has an active state,
/// it will be disconnected. If the session is already registered,
/// an exception will be thrown.
///
/// @param session An instance of the session to be maintained.
/// @param scheduleId The id of the predefined schedule
/// to use for the given session.
/// @param connectionId The id of the predefined connection
/// settings to use for the given session.
void
add(
Session * session,
const SessionScheduleId & scheduleId,
const SessionConnectionSettingsId & connectionId);
/// Removes the session from the automatic connection management services.
/// If the session were not registered before, it does actually nothing.
void remove(Session * session);
/// Processes events on the Scheduler and performs the necessary session management.
///
/// This method should be called periodically and only when the ExternalThread threading model is used.
/// This method is not thread-safe.
void dispatchEvents();
/**
* Sets the CPU affinity of the Scheduler service thread.
*/
void serviceThreadAffinity(const OnixS::Threading::CpuIndexes & cpuIndexes);
/**
* Returns the CPU affinity of the Scheduler service thread.
*/
const OnixS::Threading::CpuIndexes & serviceThreadAffinity() const;
/**
* Sets the number of logon attempts in case of a logon failure.
*/
void reconnectAttempts(int value);
/**
* Returns the number of logon attempts in case of a logon failure.
* By default, the option value is equal to 3.
*/
int reconnectAttempts() const;
/**
* Sets the time interval between logon attempts in case of a logon failure. (in seconds).
*/
void reconnectInterval(int value);
/**
* Returns the time interval between logon attempts in case of a logon failure. (in seconds).
* By default, the option value is equal to 180 seconds.
*/
int reconnectInterval() const;
/**
* This property allows switching the local time to the UTC time usage.
*/
void utcTimeUsage(bool value);
/**
* Returns true if the UTC time is used otherwise false.
* By default, the option value is false.
*/
bool utcTimeUsage() const;
private:
class Impl;
Impl * impl_;
};
}
}
}