package Ġorg . gob lin framework . embedded . server Ċ Ċ import Ġorg . gob lin framework . api . annotation . Singleton Ċ import Ġorg . gob lin framework . api . annotation . Thread Safe Ċ import Ġorg . gob lin framework . api . function . Disposable Ċ import Ġorg . gob lin framework . core . exception . G ob lin Duplicate Exception Ċ import Ġorg . gob lin framework . core . reactor . Core Scheduler Ċ import Ġorg . gob lin framework . core . service . G ob lin Managed Bean Ċ import Ġorg . gob lin framework . core . service . G ob lin ManagedObject Ċ import Ġorg . gob lin framework . embedded . setting . Server Setting Ċ import Ġjava . util . concurrent . Count DownLatch Ċ import Ġjava . util . concurrent . locks . Re entrant ReadWrite Lock Ċ import Ġkotlin . concurrent . read Ċ import Ġkotlin . concurrent . write Ċ Ċ @ Singleton Ċ @ Thread Safe Ċ @ G ob lin Managed Bean (" Embedded ") Ċ class ĠEmbedded Server Manager Ġprivate Ġconstructor () Ġ: ĠG ob lin ManagedObject (), ĠEmbedded Server Manager MX Bean Ġ{ ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġ@ Jvm Field Ġval ĠINSTANCE Ġ= ĠEmbedded Server Manager () ĊĠ Ġ} ĊĊĠ Ġprivate Ġval Ġlock Ġ= ĠRe entrant ReadWrite Lock () ĊĠ Ġprivate Ġval Ġservers Ġ= Ġmutable Map Of < Embedded Server Id , ĠEmbedded Server >() ĊĊĠ Ġfun Ġcreate Server ( setting : ĠServer Setting ): ĠEmbedded Server Ġ{ ĊĠĠĠ Ġval Ġname Ġ= Ġsetting . name () ĊĠĠĠ Ġval Ġmode Ġ= Ġsetting . mode () ĊĠĠĠ Ġval Ġfactory Ġ= ĠEmbedded Server Factory Manager . INSTANCE . get Factory ( mode ) ĊĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠUnsupportedOperationException (" Embedded Server Mode Ġnot Ġavailable : Ġ$ mode ") ĊĠĠĠ Ġval Ġid Ġ= ĠEmbedded Server Id ( mode , Ġname ) ĊĠĠĠ Ġreturn Ġlock . write Ġ{ ĊĠĠĠĠĠ Ġservers [ id ]?. run Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠG ob lin Duplicate Exception (" Embedded Server Ġ[$ mode /$ name ] Ġalready Ġexists ") ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġval Ġserver Ġ= Ġfactory . create Embedded Server ( setting ) ĊĠĠĠĠĠ Ġservers [ id ] Ġ= Ġserver ĊĠĠĠĠĠ Ġserver ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġclose Server ( id : ĠEmbedded Server Id ) Ġ{ ĊĠĠĠ Ġlock . write Ġ{ Ġservers . remove ( id ) Ġ} ?. run Ġ{ ĊĠĠĠĠĠ Ġthis . stop () ĊĠĠĠĠĠ Ġ( this Ġas ? ĠDis posable )?. dispose () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġget Embedded Server List (): ĠArray < Embedded Server MX Bean > Ġ{ ĊĠĠĠ Ġreturn Ġlock . read Ġ{ ĊĠĠĠĠĠ Ġservers . values . filter Is Instance ( Embedded Server MX Bean :: class . java ). to Typed Array () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġdispose Bean () Ġ{ ĊĠĠĠ Ġlock . write Ġ{ ĊĠĠĠĠĠ Ġif Ġ( servers . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġval Ġl atch Ġ= ĠCount DownLatch ( servers . size ) ĊĠĠĠĠĠ Ġservers . values . forEach Ġ{ Ġserver Ġ-> ĊĠĠĠĠĠĠĠ ĠCore Scheduler . getInstance (). schedule Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserver . stop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( server Ġas ? ĠDis posable )?. dispose () ĊĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġl atch . count Down () ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġl atch . await () ĊĠĠĠĠĠ Ġservers . clear () ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ }