To enable monitoring functionality set Monitoring.enable parameter to 'true' value and define necessary administrative session parameters. If monitoring is disabled, sessions with TargetCompID equal to FIXADMIN are processed as usual.
Monitoring requires FIX protocol customization of the XML(n) message in following way:
<fixdic fixversion="4.4" title="FA Monitoring FIX 4.4" date="2008/05/12"> <fielddic> <fielddef tag="9207" name="MonitoringRequestId" type="String"/> </fielddic> <msgdic> <msgdef msgtype="n"> <field tag="9207" req="N"/> </msgdef> </msgdic> </fixdic>
<SessionsList />
<Response ResultCode="0">
<SessionsListData>
<Session>
<SenderCompID>TestSender</SenderCompID>
<TargetCompID>TestTarget</TargetCompID>
</Session>
<Session>
<SenderCompID>TROIOI</SenderCompID>
<TargetCompID>AUTEX</TargetCompID>
</Session>
</SessionsListData>
</Response>
<SessionStat>
<SenderCompID>TestSender</SenderCompID>
<TargetCompID>TestTarget</TargetCompID>
</SessionStat>
<Response ResultCode="0">
<SessionStatData>
<SenderCompID>TestSender</SenderCompID>
<TargetCompID>TestTarget</TargetCompID>
<ReceivedBytes>5107901</ReceivedBytes>
<SentBytes>6445854</SentBytes>
<ReceivedMessages>25539</ReceivedMessages>
<SentMessages>32229</SentMessages>
<ReceivedHandlingTime>5782453</ReceivedHandlingTime>
<SentHandlingTime>7143127</SentHandlingTime>
<Established>2008-05-13T07:55:23</Established>
<TerminatedNormal>2008-05-13T07:51:34</TerminatedNormal>
<TerminatedAbnormal>2008-05-10T15:43:11</TerminatedAbnormal>
<DurationSum>94734720</DurationSum>
<LastReceivedMessage>2008-05-13T18:21:10</LastReceivedMessage>
<LastSentMessage>2008-05-13T18:21:10</LastSentMessage>
<SessionStatData>
</Response>
<SessionStatus>
<SenderCompID>TestSender</SenderCompID>
<TargetCompID>TestTarget</TargetCompID>
</SessionStatus>
<Response ResultCode="0">
<SessionStatusData>
<SenderCompID>TestSender</SenderCompID>
<TargetCompID>TestTarget</TargetCompID>
<Status>WaitForConfirmLogout</Status>
</SessionStatusData>
</Response>
<GeneralSessionsStat />
<Response ResultCode="0">
<GeneralSessionsStatData>
<ActiveSessions>2</ActiveSessions>
<ReconnectingSessions>1</ReconnectingSessions>
<AwaitingSessions>0</AwaitingSessions>
<TerminatedNormalSessions>32</TerminatedNormalSessions>
<TerminatedAbnormalSessions>5</TerminatedAbnormalSessions>
</GeneralSessionsStatData>
</Response>
<AverageReceivedStat>
<Version>FIX42</Version>
<Type>D</Type>
</AverageReceivedStat>
<Response ResultCode="0">
<AverageReceivedStatData>
<Version>FIX42</Version>
<Type>D</Type>
<AverageTime>226</AverageTime>
</AverageReceivedStatData>
</Response>
<AverageSentStat>
<Version>FIX42</Version>
<Type>8</Type>
</AverageSentStat>
<Response ResultCode="0">
<AverageSentStatData>
<Version>FIX42</Version>
<Type>8</Type>
<AverageTime>221</AverageTime>
</AverageSentStatData>
</Response>
<AverageValidateStat>
<Version>FIX42</Version>
<Type>8</Type>
</AverageValidateStat>
<Response ResultCode="0">
<AverageValidateStatData>
<Version>FIX42</Version>
<Type>8</Type>
<AverageTime>142</AverageTime>
</AverageValidateStatData>
</Response>
<ReceivedStat />
<Response ResultCode="0">
<ReceivedStatData>
<ReceivedMessages>76617</ReceivedMessages>
</ReceivedStatData>
</Response>
<SentStat />
<Response ResultCode="0">
<SentStatData>
<SentMessages>96687</SentMessages>
</SentStatData>
</Response>
<ProceedStat />
<Response ResultCode="0">
<ProceedStatData>
<ProceedMessages>173304</ProceedMessages>
</ProceedStatData>
</Response>
\subsection sec_21_2_11 CreateAcceptor - creates FIX session as acceptor
Example of request:
\code
<CreateAcceptor>
<SenderCompID>TestSender</SenderCompID>
<TargetCompID>TestTarget</TargetCompID>
<Version>FIX44</Version>
</CreateAcceptor>
<Response ResultCode="0"/>
<Delete>
<SenderCompID>TestSender</SenderCompID>
<TargetCompID>TestTarget</TargetCompID>
<SendLogout>true</SendLogout>
<LogoutReason>Evacuation</LogoutReason>
</Delete>
<Response ResultCode="0"/>
<ToBackup>
<SenderCompID>TestSender</SenderCompID>
<TargetCompID>TestTarget</TargetCompID>
</ToBackup>
Example of response:
\code
<Response ResultCode="3">
<Description>Unknown session</Description>
</Response>
<ChangeSeqNum>
<SenderCompID>TestSender</SenderCompID>
<TargetCompID>TestTarget</TargetCompID>
<InSeqNum>100</InSeqNum>
<OutSeqNum>100</OutSeqNum>
</ChangeSeqNum>
Example of response:
\code
<Response ResultCode="0"/>
<ResetSeqNum>
<SenderCompID>TestSender</SenderCompID>
<TargetCompID>TestTarget</TargetCompID>
</ResetSeqNum>
<Response ResultCode="0"/>
<TestRequest>
<SenderCompID>TestSender</SenderCompID>
<TargetCompID>TestTarget</TargetCompID>
<TestReqID>12345576</TestReqID>
</TestRequest>
Example of response:
\code
<Response ResultCode="0"/>
<Heartbeat>
<SenderCompID>TestSender</SenderCompID>
<TargetCompID>TestTarget</TargetCompID>
</Heartbeat>
Example of response:
\code
<Response ResultCode="0"/>
<SendMessage>
<SenderCompID>TestSender</SenderCompID>
<TargetCompID>TestTarget</TargetCompID>
<Message>8=FIX.4.29=05635=849=THEM56=US37=117=134=53011=00492-0476150=039=010=161</Message>
</SendMessage>
<Response ResultCode="0"/>
<DeleteAll>
<SendLogout>true</SendLogout>
<LogoutReason>Evacuation</LogoutReason>
</DeleteAll>
<Response ResultCode="0">
<DeleteAllData>
<Deleted>4</Deleted>
<Failed>
<Session>
<SenderCompID>TestSender</SenderCompID>
<TargetCompID>TestTarget</TargetCompID>
<Description>Access denied</Description>
</Session>
</Failed>
</DeleteAllData>
</Response>
<Help />
<Response ResultCode="0"> <HelpData> <DeleteAll> <Description>deletes all FIX sessions</Description> <Parameter> <Name>SendLogout</Name> <Description>flag defines wheter logout must be sent</Description> <IsRequired>false</IsRequired> <DefaultValue>true</DefaultValue> <Value>true</Value><Value>false</Value> </Parameter> <Parameter> <Name>LogoutReason</Name> <Description>disconnect reason</Description> <IsRequired>false</IsRequired> </Parameter> </DeleteAll> <Help> <Description>get list of supported commands</Description> </Help> </HelpData> </Response>
class CustomAdmin : public Engine::AdminApplication{ public: virtual bool process(const std::string& action, const DOMNode* element, const Context& context){ if (action == "ImplementationVersion") { sendResponse("<?xml version=\"1.0\"?><Response ResultCode=\"0\">" "<ImplementationVersionData>" + strVERSION + "</ImplementationVersionData></Response>", context); return true; } return AdminApplication::process(action, element, context); } virtual void getAvailableCommands(AdminApplication::CommandTable* commands) const { AdminApplication::getAvailableCommands(commands); (*commands)["ImplementationVersion"] = "<ImplementationVersion>" "<Description>get version of server implementation</Description>" "</ImplementationVersion>"; } };
CustomAdmin adminApp;
FixEngine::singleton()->registerAdminApplication(&adminApp);
// ... - business logic
FixEngine::singleton()->registerAdminApplication(NULL);
1.5.6