package Ġai . plat on . pulsar . common . concurrent Ċ Ċ import Ġcom . google . common . util . concurrent . Thread Factory Builder Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . time . Duration Ċ import Ġjava . util . concurrent . Executors Ċ import Ġjava . util . concurrent . Scheduled ExecutorService Ċ import Ġjava . util . concurrent . Scheduled Future Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġjava . util . concurrent . atomic . Atomic Boolean Ċ Ċ /** Ċ Ġ* ĠTODO : Ġjava . util . Time Ġis Ġperfect Ċ Ġ* Ġ*/ Ċ abstract Ġclass ĠScheduled Monitor ( ĊĠĠĠĠĠĠĠ Ġvar Ġinitial Delay : ĠDuration Ġ= ĠDuration . of Minutes ( 5 ), ĊĠĠĠĠĠĠĠ Ġvar Ġwatch Interval : ĠDuration Ġ= ĠDuration . of Seconds ( 3 0 ), ĊĠĠĠĠĠĠĠ Ġval Ġexecutor : ĠScheduled ExecutorService Ġ= Ġcreate Default Executor (), ĊĠĠĠĠĠĠĠ Ġval Ġauto Close : ĠBoolean Ġ= Ġtrue Ċ ): ĠAuto Closeable Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠLoggerFactory . getLogger ( Scheduled Monitor :: class . java ) ĊĊĠĠĠ Ġprotected Ġvar Ġscheduled Future : ĠScheduled Future < *> ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStarts Ġthe Ġmonitor Ġat Ġthe Ġgiven Ġperiod Ġwith Ġthe Ġspecific Ġrunnable Ġaction ĊĠĠĠĠ Ġ* ĠVis ible Ġonly Ġfor Ġtesting ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġstart ( initial Delay : ĠDuration , Ġperiod : ĠDuration , Ġrunnable : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstart ( initial Delay . seconds , Ġperiod . seconds , ĠTimeUnit . SECONDS ) Ġ{ Ġrunnable () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstart ( initial Delay : ĠDuration , Ġperiod : ĠDuration ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstart ( initial Delay . seconds , Ġperiod . seconds , ĠTimeUnit . SECONDS ) Ġ{ Ġwatch () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStarts Ġthe Ġreporter Ġpolling Ġat Ġthe Ġgiven Ġperiod . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġperiod Ġthe Ġamount Ġof Ġtime Ġbetween Ġpol ls ĊĠĠĠĠ Ġ* Ġ@ param Ġunit ĠĠ Ġthe Ġunit Ġfor Ġ` period ` ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġstart ( period : ĠLong , Ġunit : ĠTimeUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstart ( period , Ġperiod , Ġunit ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStarts Ġthe Ġreporter Ġpolling Ġat Ġthe Ġgiven Ġperiod Ġwith Ġthe Ġspecific Ġrunnable Ġaction . ĊĠĠĠĠ Ġ* ĠVis ible Ġonly Ġfor Ġtesting . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġopen Ġfun Ġstart ( initial Delay : ĠLong , Ġperiod : ĠLong , Ġunit : ĠTimeUnit , Ġrunnable : ĠRunnable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( scheduled Future Ġ== Ġnull ) Ġ{ Ġ" Scheduled Ġmonitor Ġis Ġalready Ġstarted Ġ| Ġ${ this . java Class . simple Name }" Ġ} ĊĠĠĠĠĠĠĠ Ġscheduled Future Ġ= Ġexecutor . schedule At Fixed Rate ( run nable , Ġinitial Delay , Ġperiod , Ġunit ) ĊĠĠĠĠĠĠĠ Ġlog . info (" Scheduled Ġmonitor Ġis Ġstarted Ġ| Ġ{}", Ġthis . java Class . simple Name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStarts Ġthe Ġreporter Ġpolling Ġat Ġthe Ġgiven Ġperiod . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġinitial Delay Ġthe Ġtime Ġto Ġdelay Ġthe Ġfirst Ġexecution ĊĠĠĠĠ Ġ* Ġ@ param Ġperiod ĠĠĠĠĠĠ Ġthe Ġamount Ġof Ġtime Ġbetween Ġpol ls ĊĠĠĠĠ Ġ* Ġ@ param Ġunit ĠĠĠĠĠĠĠĠ Ġthe Ġunit Ġfor Ġ` period ` Ġand Ġ` initial Delay ` ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġopen Ġfun Ġstart ( initial Delay : ĠLong , Ġperiod : ĠLong , Ġunit : ĠTimeUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstart ( initial Delay , Ġperiod , Ġunit , ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwatch () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" Exception Ġthrown Ġfrom Ġ{} # report . ĠException Ġwas Ġsupp ressed .", Ġjava Class . simple Name , Ġex ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstart () Ġ= Ġstart ( initial Delay , Ġwatch Interval ) Ġ{ Ġwatch () Ġ} ĊĊĠĠĠ Ġabstract Ġfun Ġwatch () ĊĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( auto Close ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop Execution ( executor , Ġscheduled Future , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" Scheduled Ġmonitor Ġis Ġclosed Ġ| Ġ$ this ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcreate Default Executor (): ĠScheduled ExecutorService Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfactory Ġ= ĠThread Factory Builder (). setName Format (" em -% d "). build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠExec utors . new Single Thread Scheduled Executor ( factory ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ