/** Ċ Ġ* ĠCopyright Ġ 2 0 1 7 - 2 0 1 9 Ġthe Ġoriginal Ġauthor Ġor Ġauthors Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġio . zh udy . du ic . service Ċ Ċ import Ġio . zh udy . du ic . Config Ċ import Ġio . zh udy . du ic . DB MS Ċ import Ġio . zh udy . du ic . Du ic Version Ċ import Ġio . zh udy . du ic . annotation . No IntegrationTest Ċ import Ġio . zh udy . du ic . domain . Server Info Ċ import Ġio . zh udy . du ic . dto . Server Refresh Dto Ċ import Ġio . zh udy . du ic . dto . Server State Dto Ċ import Ġio . zh udy . du ic . repository . Server Repository Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . springframework . beans . factory . annotation . Value Ċ import Ġorg . springframework . context . annotation . Configuration Ċ import Ġorg . springframework . context . annotation . Dep ends On Ċ import Ġorg . springframework . http . MediaType Ċ import Ġorg . springframework . scheduling . annotation . Scheduled Ċ import Ġorg . springframework . stereotype . Service Ċ import Ġorg . springframework . web . reactive . function . client . Web Client Ċ import Ġreactor . core . publisher . Flux Ċ import Ġreactor . core . publisher . Mono Ċ import Ġreactor . core . scheduler . Schedulers Ċ import Ġjavax . annotation . Post Construct Ċ import Ġjavax . annotation . Pre Destroy Ċ Ċ /** Ċ Ġ* Ġ éĽĨç¾¤ æľįåĬ¡ ç®¡çĲĨ ãĢĤ Ċ Ġ* Ċ Ġ* Ġ@ author ĠKevin ĠZ ou Ġ( ke vin z @ we gh st . com ) Ċ Ġ*/ Ċ @ Service Ċ @ Dep ends On (" io . zh udy . du ic . Config ") Ċ class ĠServer Service ( ĊĠĠĠĠĠĠĠ Ġval Ġserver Repository : ĠServer Repository , ĊĠĠĠĠĠĠĠ Ġval Ġweb Client Builder : ĠWeb Client . Builder , ĊĠĠĠĠĠĠĠ Ġ@ Value ("% { du ic . dbms }") ĊĠĠĠĠĠĠĠ Ġval Ġdb ms : ĠString Ċ ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠLoggerFactory . getLogger ( Server Service :: class . java ) ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠP ING _ DELAY Ġ= Ġ 3 0 Ġ* Ġ 1 0 0 0 L ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġ_ dbms Ġ= ĠDB MS . forName ( dbms ) ĊĊĠĠĠ Ġprivate Ġval Ġfail Server Refresh Dto Ġ= ĠServer Refresh Dto ( last Data Time Ġ= Ġ- 1 ) ĊĊĠĠĠ Ġ@ No IntegrationTest ĊĠĠĠ Ġ@ Configuration ĊĠĠĠ Ġinner Ġclass ĠLifecycle Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠæľįåĬ¡ åĲ¯åĬ¨ æĪĲåĬŁ åĲİ ä¼ļ èĩªåĬ¨ æ³¨åĨĮ å½ĵåīį æľįåĬ¡ ãĢĤ ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Post Construct ĊĠĠĠĠĠĠĠ Ġfun Ġinit () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Server Service . register () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠæľįåĬ¡ åģľæŃ¢ åĲİ ä¼ļ èĩªåĬ¨ ä¸ĭ çº¿ å½ĵåīį æľįåĬ¡ ãĢĤ ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Pre Destroy ĊĠĠĠĠĠĠĠ Ġfun Ġdestroy () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Server Service . unregister () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ æ³¨åĨĮ å½ĵåīį æľįåĬ¡ ãĢĤ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġregister () Ġ{ ĊĠĠĠĠĠĠĠ Ġserver Repository . register ( Config . server . host , ĠConfig . server . port ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do OnError Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" register ĠæľįåĬ¡ å¤±è´¥ : Ġ${ Config . server . host }:${ Config . server . port }", Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæ¸ ħ éĻ¤ å½ĵåīį å·² æ³¨åĨĮ çļĦ æľįåĬ¡ ãĢĤ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġunregister () Ġ{ ĊĠĠĠĠĠĠĠ Ġserver Repository . unregister ( Config . server . host , ĠConfig . server . port ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do OnError Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" unregister ĠæľįåĬ¡ å¤±è´¥ : Ġ${ Config . server . host }:${ Config . server . port }", Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠæľįåĬ¡ å¿ĥ è·³ ãĢĤ æ¯ı éļĶ [ PING _ DELAY ] æ¯ « ç§Ĵ ï¼Į ä¼ļ å®ļæĹ¶ ç»´ æĮģ æľįåĬ¡ å¿ĥ è·³ ãĢĤ è¶ħæĹ¶ çļĦ æľįåĬ¡ ä¼ļ è¢« èĩªåĬ¨ ä¸ĭ çº¿ ãĢĤ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Scheduled ( initial Delay Ġ= ĠP ING _ DELAY , Ġfixed Delay Ġ= ĠP ING _ DELAY ) ĊĠĠĠ Ġfun Ġclock Ping () Ġ{ ĊĠĠĠĠĠĠĠ Ġserver Repository ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. ping ( Config . server . host , ĠConfig . server . port ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. then ( server Repository . clean ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ åĬłè½½ éĽĨç¾¤ æľįåĬ¡ ä¸Ń éħįç½® æľĢåĲİ æĽ´æĸ° çļĦ çĬ¶æĢģ ãĢĤ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġload Server States (): ĠFlux < Server State Dto > Ġ= Ġserver Repository . find Servers (). flatMap Sequential Ġ{ Ġs Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġserver Ġ= ĠConfig . server ĊĠĠĠĠĠĠĠ Ġval Ġschema Ġ= Ġif Ġ( server . ssl Enabled ) Ġ" https " Ġelse Ġ" http " ĊĠĠĠĠĠĠĠ Ġweb Client Builder . baseUrl ("$ schema ://${ s . host }:${ s . port }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. uri ("/ api / servers / last - data - time ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. accept ( MediaType . APPLICATION _ JSON ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. retrieve () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Status ({ Ġ! it . is 2 xx Successful Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMono . error ( IllegalStateException (" http Ġstatus : Ġ${ it . statusCode (). value ()} ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. body To Mono ( Server Refresh Dto :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . elastic ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. onError Return ( fail Server Refresh Dto ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠServer State Dto ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhost Ġ= Ġs . host , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġport Ġ= Ġs . port , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit At Ġ= Ġs . init At , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactive At Ġ= Ġs . active At , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Data Time Ġ= Ġit . last Data Time ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġè¿ĶåĽŀ æľįåĬ¡ ä¿¡æģ¯ ãĢĤ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġinfo (): ĠMono < Server Info > Ġ= Ġserver Repository . find Db Version (). map Ġ{ ĊĠĠĠĠĠĠĠ ĠServer Info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ" du ic ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġversion Ġ= ĠDu ic Version . version , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb Name Ġ= Ġ_ dbms . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb Version Ġ= Ġit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġos Name Ġ= ĠSystem . getProperty (" os . name "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġos Version Ġ= ĠSystem . getProperty (" os . version "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġos Arch Ġ= ĠSystem . getProperty (" os . arch "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjava Version Ġ= ĠSystem . getProperty (" java . version ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠæľįåĬ¡ åģ ¥ åº· æ£ĢæŁ¥ ãĢĤ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġhealth (): ĠMono < String > Ġ= Ġserver Repository . find Db Version (). onError Resume Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠ Ġlog . error ("", Ġe ) ĊĠĠĠĠĠĠĠ Ġthrow ĠHealth Check Exception ( 5 0 3 , Ġ"$ _ dbms Ġhealth Ġcheck Ġfailed ") ĊĠĠĠ Ġ} Ċ }