package Ġno . nav . pg i . pop p . lag re inn te kt Ċ Ċ import Ġno . nav . pens jon . sam handling . na is server . na is Server Ċ import Ġno . nav . pg i . pop p . lag re inn te kt . kafka . Kafka Factory Ċ import Ġno . nav . pg i . pop p . lag re inn te kt . kafka . Kafka In n te kt Factory Ċ import Ġno . nav . pg i . pop p . lag re inn te kt . pop p . Pop p Client Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . util . concurrent . atomic . Atomic Boolean Ċ import Ġkotlin . system . exit Process Ċ Ċ fun Ġmain () Ġ{ ĊĠĠĠ Ġval Ġapplication Ġ= ĠApplication () ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġapplication . start Lag re In n te kt Pop p () ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġapplication . stop () ĊĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠ Ġexit Process ( 0 ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġclass ĠApplication ( ĊĠĠĠ Ġkafka Factory : ĠKafka Factory Ġ= ĠKafka In n te kt Factory (), ĊĠĠĠ Ġenv : ĠMap < String , ĠString > Ġ= ĠSystem . getenv (), Ċ ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġna is Server Ġ= Ġna is Server () ĊĠĠĠ Ġprivate Ġval Ġpop p Client Ġ= ĠPop p Client ( env ) ĊĠĠĠ Ġprivate Ġval Ġlag re In n te kt Pop p Ġ= ĠL ag re In n te kt Pop p ( pop p Client , Ġkafka Factory ) ĊĠĠĠ Ġprivate Ġvar Ġstarted Ġ= ĠAtomic Boolean ( false ) ĊĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Shutdown Hook () ĊĠĠĠĠĠĠĠ Ġna is Server . start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠLOG Ġ= ĠLoggerFactory . getLogger ( Application :: class . java ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠSE C URE _ LOG Ġ= ĠLoggerFactory . getLogger (" t jen est ek all ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġstart Lag re In n te kt Pop p ( loop Fore ver : ĠBoolean Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstarted . set ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlag re In n te kt Pop p . start ( loop Fore ver ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . error ( e . message ) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠtearDown () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun ĠtearDown () Ġ{ ĊĠĠĠĠĠĠĠ ĠLOG . info (" Closing Ġna is Server Ġand Ġlag re In n te kt Pop p ") ĊĠĠĠĠĠĠĠ Ġna is Server . stop ( 5 0 0 , Ġ 5 0 0 ) ĊĠĠĠĠĠĠĠ Ġlag re In n te kt Pop p . close Kafka () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġstop () Ġ{ ĊĠĠĠĠĠĠĠ ĠLOG . info (" Stopping Ġna is Server Ġand Ġlag re In n te kt Pop p ") ĊĠĠĠĠĠĠĠ Ġlag re In n te kt Pop p . stop () ĊĠĠĠĠĠĠĠ ĠThread . sleep ( 3 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! lag re In n te kt Pop p . is Closed ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info (" Failed Ġto Ġstop Ġlag re In n te kt Pop p ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠtearDown () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Shutdown Hook () Ġ{ ĊĠĠĠĠĠĠĠ ĠRuntime . get Runtime (). add Shutdown Hook ( Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info (" Stopping Ġapplication Ġfrom Ġshutdown Ġhook ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info (" Shutdown hook Ġfailed Ġtrying Ġto Ġclose Ġkafka ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtearDown () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} Ċ } Ċ