package Ġlearning . zookeeper Ċ Ċ import Ġorg . apache . zookeeper .* Ċ import Ġorg . apache . zookeeper . data . Stat Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ class ĠMaster ( val Ġhost Port : ĠString ) Ġ: ĠWatch er Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġzk : ĠZ oo Keeper ĊĊĠĠĠ Ġprivate Ġval Ġserver Id Ġ= ĠInteger . to HexString ( Random (). nextInt ()) ĊĠĠĠ Ġvar Ġis Leader Ġ= Ġfalse ĊĊĠĠĠ Ġfun Ġstart ZK () Ġ{ ĊĠĠĠĠĠĠĠ Ġzk Ġ= ĠZ oo Keeper ( host Port , Ġ 1 5 0 0 0 , Ġthis ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcheck Master (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstat Ġ= ĠStat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġzk . getData ("/ master ", Ġfalse , Ġstat ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Leader Ġ= ĠString ( data ) Ġ== Ġserver Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠK eeper Exception . No Node Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġno Ġmaster , Ġso Ġtry Ġcreate Ġagain ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠK eeper Exception . Connection Loss Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTimeUnit . MILLISECONDS . sleep ( 1 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrun For Master () Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzk . create ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"/ master ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserver Id . toByteArray (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠZ oo Defs . Ids . OPEN _ ACL _ UN SAFE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCreate Mode . EP HE MER AL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Leader Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch ( e : ĠK eeper Exception . Node Exists Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Leader Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠK eeper Exception . Connection Loss Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTimeUnit . MILLISECONDS . sleep ( 1 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( check Master ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstop ZK () Ġ{ ĊĠĠĠĠĠĠĠ Ġzk . close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġprocess ( event : ĠW atched Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln ( event ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġmain ( args : ĠArray < String >) Ġ{ ĊĠĠĠ Ġval Ġmaster Ġ= ĠMaster (" 1 2 7 . 0 . 0 . 1 : 2 1 8 1 ") ĊĊĠĠĠ Ġmaster . start ZK () ĊĠĠĠ Ġmaster . run For Master () ĊĊĠĠĠ Ġif Ġ( master . is Leader ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" I 'm Ġthe Ġleader ") ĊĠĠĠĠĠĠĠ ĠTimeUnit . SECONDS . sleep ( 6 0 ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" Some one Ġelse Ġis Ġthe Ġleader ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġmaster . stop ZK () Ċ } Ċ