package Ġcom . sw iss chain . matching . engine . messages Ċ Ċ import Ġcom . sw iss chain . matching . engine . database . Persistence Manager Ċ import Ġcom . sw iss chain . matching . engine . database . common . entity . Persistence Data Ċ import Ġcom . sw iss chain . matching . engine . ded up lication . Processed Messages Cache Ċ import Ġcom . sw iss chain . matching . engine . holders . Current Transaction Data Holder Ċ import Ġcom . sw iss chain . matching . engine . holders . Message Processing Status Holder Ċ import Ġcom . sw iss chain . matching . engine . holders . Message SequenceNumber Holder Ċ import Ġcom . sw iss chain . matching . engine . incoming . Message Router Ċ import Ġcom . sw iss chain . matching . engine . performance . Performance Stats Holder Ċ import Ġcom . sw iss chain . matching . engine . services . Abstract Service Ċ import Ġcom . sw iss chain . matching . engine . services . Cash InOut Operation Service Ċ import Ġcom . sw iss chain . matching . engine . services . Cash Transfer Operation Service Ċ import Ġcom . sw iss chain . matching . engine . services . Limit Order Cancel Service Ċ import Ġcom . sw iss chain . matching . engine . services . Limit Order Mass Cancel Service Ċ import Ġcom . sw iss chain . matching . engine . services . Market Order Service Ċ import Ġcom . sw iss chain . matching . engine . services . Multi Limit Order Service Ċ import Ġcom . sw iss chain . matching . engine . services . Reserved Cash InOut Operation Service Ċ import Ġcom . sw iss chain . matching . engine . services . Single Limit Order Service Ċ import Ġcom . sw iss chain . utils . logging . Metrics Logger Ċ import Ġcom . sw iss chain . utils . logging . Th rottling Logger Ċ import Ġorg . springframework . beans . factory . annotation . Autowired Ċ import Ġorg . springframework . stereotype . Component Ċ import Ġjava . util . HashMap Ċ import Ġjavax . annotation . Post Construct Ċ Ċ @ Component Ċ class ĠMessage Processor Ġ: ĠThread ( Message Processor :: class . java . name ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠLOGGER Ġ= ĠTh rottling Logger . getLogger ( Message Processor :: class . java . name ) ĊĠĠĠĠĠĠĠ Ġval ĠMON ITOR ING _ LOGGER Ġ= ĠTh rottling Logger . getLogger ("${ Message Processor :: class . java . name }. monitoring ") ĊĠĠĠĠĠĠĠ Ġval ĠMET R ICS _ LOGGER Ġ= ĠMetrics Logger . getLogger () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmessage Router : ĠMessage Router ĊĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġpersistence Manager : ĠPersistence Manager ĊĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcash InOut Operation Service : ĠCash InOut Operation Service ĊĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcash Transfer Operation Service : ĠCash Transfer Operation Service ĊĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġsingle Limit Order Service : ĠSingle Limit Order Service ĊĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmulti Limit Order Service : ĠMulti Limit Order Service ĊĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmarket Order Service : ĠMarket Order Service ĊĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġlimit Order Cancel Service : ĠLimit Order Cancel Service ĊĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġlimit Order Mass Cancel Service : ĠLimit Order Mass Cancel Service ĊĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġreserved Cash InOut Operation Service : ĠReserved Cash InOut Operation Service ĊĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmessage Processing Status Holder : ĠMessage Processing Status Holder ĊĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcurrent Transaction Data Holder : ĠCurrent Transaction Data Holder ĊĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġprocessed Messages Cache : ĠPro cessed Messages Cache ĊĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġperformance Stats Holder : ĠPerformance Stats Holder ĊĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmessage SequenceNumber Holder : ĠMessage SequenceNumber Holder ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġservices Map : ĠMap < MessageType , ĠAbstract Service > ĊĊĠĠĠ Ġ@ Post Construct ĊĠĠĠ Ġprivate Ġfun Ġinit () Ġ{ ĊĠĠĠĠĠĠĠ Ġservices Map Ġ= Ġinit Services Map () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Message ( message Router . pre Processed Message Queue . take ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Message ( message : ĠMessage Wrapper ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠstartTime Ġ= ĠSystem . nano Time () ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Type Ġ= ĠMessageType . valueOf ( message . type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( message Type Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . error (" Unknown Ġmessage Ġtype : Ġ${ message . type }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMET R ICS _ LOGGER . log Error (" Unknown Ġmessage Ġtype : Ġ${ message . type }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Transaction Data Holder . set MessageType ( message Type ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġservice Ġ= Ġservices Map [ message Type ] ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( service Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . error (" Unknown Ġmessage Ġtype : Ġ${ message . type }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMET R ICS _ LOGGER . log Error (" Unknown Ġmessage Ġtype : Ġ${ message . type }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! message Processing Status Holder . is Message Processing Enabled ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservice . write Response ( message , ĠMessage Status . MESSAGE _ PROCESS ING _ DISABLED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! message Processing Status Holder . is Health Status Ok ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservice . write Response ( message , ĠMessage Status . RUNTIME ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠerrorMessage Ġ= Ġ" Message Ġprocessing Ġis Ġdisabled , Ġmessage Ġtype : Ġ${ MessageType . valueOf ( message . type )}, Ġmessage Ġid : Ġ${ message . message Id }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . error ( errorMessage ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMET R ICS _ LOGGER . log Error ( errorMessage ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprocessed Message Ġ= Ġmessage . processed Message ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( processed Message Ġ!= Ġnull Ġ&& Ġprocessed Messages Cache . is Processed ( processed Message . type , Ġprocessed Message . message Id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservice . write Response ( message , ĠMessage Status . DUPLIC ATE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . error (" Message Ġalready Ġprocessed : Ġ${ message . type }: Ġ${ message . message Id !! }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMET R ICS _ LOGGER . log Error (" Message Ġalready Ġprocessed : Ġ${ message . type }: Ġ${ message . message Id !! }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . process Message ( message ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocessed Message ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! message . tri ed To Persist ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . pers isted Ġ= Ġpersistence Manager . persist ( Persistence Data ( it , Ġmessage SequenceNumber Holder . getValue To Persist ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( message . pers isted ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocessed Messages Cache . addMessage ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠendTime Ġ= ĠSystem . nano Time () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( message . write Response Time Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠerrorMessage Ġ= Ġ" There Ġwas Ġno Ġwrite Ġresponse Ġto Ġsocket Ġtime Ġrecorded , Ġresponse Ġto Ġsocket Ġis Ġnot Ġwritten , ĠmessageId : Ġ${ message . message Id }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . error ( errorMessage ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMET R ICS _ LOGGER . log Error ( errorMessage ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġperformance Stats Holder . addMessage ( type Ġ= Ġmessage . type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Response Time Ġ= Ġmessage . write Response Time , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Timestamp Ġ= Ġmessage . start Timestamp , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Pre Processor Start Timestamp Ġ= Ġmessage . message Pre Processor Start Timestamp , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Pre Processor End Timestamp Ġ= Ġmessage . message Pre Processor End Timestamp , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Message Processing Time Ġ= ĠstartTime , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Message Processing Time Ġ= ĠendTime ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . error (" Got Ġerror Ġduring Ġmessage Ġprocessing : Ġ${ exception . message }", Ġexception ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMET R ICS _ LOGGER . log Error (" Got Ġerror Ġduring Ġmessage Ġprocessing ", Ġexception ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Services Map (): ĠMap < MessageType , ĠAbstract Service > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠHashMap < MessageType , ĠAbstract Service >() ĊĠĠĠĠĠĠĠ Ġresult [ MessageType . C ASH _ IN _ OUT _ OPERATION ] Ġ= Ġcash InOut Operation Service ĊĠĠĠĠĠĠĠ Ġresult [ MessageType . C ASH _ TRANSFER _ OPERATION ] Ġ= Ġcash Transfer Operation Service ĊĠĠĠĠĠĠĠ Ġresult [ MessageType . RESERVED _ C ASH _ IN _ OUT _ OPERATION ] Ġ= Ġreserved Cash InOut Operation Service ĊĠĠĠĠĠĠĠ Ġresult [ MessageType . LIMIT _ ORDER ] Ġ= Ġsingle Limit Order Service ĊĠĠĠĠĠĠĠ Ġresult [ MessageType . MARK ET _ ORDER ] Ġ= Ġmarket Order Service ĊĠĠĠĠĠĠĠ Ġresult [ MessageType . LIMIT _ ORDER _ CANCEL ] Ġ= Ġlimit Order Cancel Service ĊĠĠĠĠĠĠĠ Ġresult [ MessageType . LIMIT _ ORDER _ M ASS _ CANCEL ] Ġ= Ġlimit Order Mass Cancel Service ĊĠĠĠĠĠĠĠ Ġresult [ MessageType . MULTI _ LIMIT _ ORDER ] Ġ= Ġmulti Limit Order Service ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} Ċ }