package Ġnet . cord a . de mob ench . rpc Ċ Ċ import Ġnet . cord a . client . rpc . C ord a RPC Client Ċ import Ġnet . cord a . client . rpc . C ord a RPC Connection Ċ import Ġnet . cord a . core . messaging . C ord a RP CO ps Ċ import Ġnet . cord a . core . utilities . Network Host And Port Ċ import Ġnet . cord a . core . utilities . context Logger Ċ import Ġnet . cord a . de mob ench . model . Node Config Wrapper Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . TimeUnit . SECONDS Ċ Ċ class ĠNode RPC ( config : ĠNode Config Wrapper , Ġstart : Ġ( Node Config Wrapper , ĠC ord a RP CO ps ) Ġ-> ĠUnit , Ġinvoke : Ġ( C ord a RP CO ps ) Ġ-> ĠUnit ) Ġ: ĠAuto Closeable Ġ{ ĊĠĠĠ Ġprivate Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlog Ġ= Ġcontext Logger () ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġone Second Ġ= ĠSE CON DS . to Millis ( 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġrpc Client Ġ= ĠC ord a RPC Client ( Network Host And Port (" localhost ", Ġconfig . node Config . rpc Address . port )) ĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġprivate Ġvar Ġrpc Connection : ĠC ord a RPC Connection ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġtimer Ġ= ĠTimer (" Demo Bench ĠNode RPC Ġ(${ config . key })", Ġtrue ) ĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġprivate Ġvar Ġtimer Thread : ĠThread ? Ġ= Ġnull ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsetup Task Ġ= Ġobject Ġ: ĠTimer Task () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGrab Ġthe Ġtimer 's Ġthread Ġso Ġthat Ġwe Ġknow Ġwhich Ġone Ġto Ġinterrupt . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġlooks Ġlike Ġthe Ġsimplest Ġway Ġof Ġgetting Ġthe Ġthread . Ġ( U gh ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimer Thread Ġ= ĠThread . currentThread () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Ġ= Ġconfig . node Config . rpc Users [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġops : ĠC ord a RP CO ps Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrpc Client . start ( user . username , Ġuser . password ). let Ġ{ Ġconnection Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrpc Connection Ġ= Ġconnection ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection . proxy ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn (" Node Ġ'{}' Ġnot Ġready Ġyet Ġ( Error : Ġ{}) ", Ġconfig . node Config . my Legal Name , Ġe . message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCancel Ġthe Ġ" setup " Ġtask Ġnow Ġthat Ġwe 've Ġcreated Ġthe ĠRPC Ġclient . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcancel () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRun Ġ" start - up " Ġtask , Ġnow Ġthat Ġthe ĠRPC Ġclient Ġis Ġready . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart ( config , Ġops ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSchedule Ġa Ġnew Ġtask Ġthat Ġwill Ġrefresh Ġthe Ġdisplay Ġonce Ġper Ġsecond . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimer . schedule ( object Ġ: ĠTimer Task () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvoke ( ops ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ 0 , Ġone Second ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠWait Ġ 5 Ġseconds Ġfor Ġthe Ġnode Ġto Ġstart , Ġand Ġthen Ġpoll Ġonce Ġper Ġsecond . ĊĠĠĠĠĠĠĠ Ġtimer . schedule ( setup Task , Ġ 5 Ġ* Ġone Second , Ġone Second ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġtimer . cancel () ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNo Ġneed Ġto Ġnotify Ġthe Ġnode Ġbecause Ġit 's Ġalso Ġshut ting Ġdown . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrpc Connection ?. force Close () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" Failed Ġto Ġclose ĠRPC Ġconnection Ġ( Error : Ġ{}) ", Ġe . message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtimer Thread ?. interrupt () ĊĠĠĠ Ġ} Ċ } Ċ