package Ġcom . port er head . sms . provider Ċ Ċ import Ġcom . port er head . sms . domain . Sms Message Ċ import Ġmu . Kotlin Logging Ċ import Ġjava . util .* Ċ import Ġjavax . annotation . Post Construct Ċ import Ġjavax . enterprise . context . Application Scoped Ċ import Ġjavax . enterprise . inject . Instance Ċ import Ġjavax . inject . Inject Ċ import Ġkotlin . system . exit Process Ċ Ċ @ Application Scoped Ċ class ĠRandom Provider Router ( val Ġproviders : ĠInstance < Sms Provider >) Ġ: ĠProvider Router Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠKotlin Logging . logger Ġ{} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( providers . count () Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error Ġ{ Ġ" ******* ĠApplication Ġis Ġquit ting Ġas Ġat Ġleast Ġone ĠSMS ĠProvider Ġmust Ġbe Ġconfigured Ġ* ******* " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexit Process ( 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġproviders . forEach Ġ{ Ġlog . debug Ġ{ Ġ" Provider : Ġ$ it Ġhas Ġbeen Ġconfigured Ġto Ġsend Ġmessages " Ġ} Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġrandom : ĠRandom Ġ= ĠRandom () ĊĊĠĠĠ Ġoverride Ġfun Ġroute Message ( message : ĠS ms Message ): ĠProvider Response Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġroute Message Internal ( message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRoute Ġthe Ġmessage Ġto Ġa Ġrandom ĠProvider Ġfrom Ġthe Ġlist Ġof ĠPro viders ĊĠĠĠĠ Ġ* ĠIf Ġthere Ġis Ġa Ġserver Ġfailure Ġthen Ġpick Ġanother Ġunused Ġprovider Ġto Ġtry Ġthe Ġmessage Ġagain ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġroute Message Internal ( message : ĠS ms Message ): ĠProvider Response Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġrandom . nextInt ( providers . count ()) ĊĠĠĠĠĠĠĠ Ġval Ġprovider Ġ= Ġproviders . toList ()[ index ] ĊĠĠĠĠĠĠĠ Ġmessage . provider Ġ= Ġprovider . getName () ĊĠĠĠĠĠĠĠ Ġval Ġstatus Ġ= Ġprovider . send Sms ( message ) ĊĠĠĠĠĠĠĠ Ġ// only Ġretry Ġwhen Ġthere Ġis Ġa Ġfailed Ġmessage ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( status Ġis ĠProvider Response . FAILED Ġ&& Ġproviders . count () Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġnext Index : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Index Ġ= Ġrandom . nextInt ( providers . count ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( next Index Ġ== Ġindex ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprovider Ġ= Ġproviders . toList ()[ next Index ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . provider Ġ= Ġprovider . getName () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" retry ing Ġmessage Ġwith Ġdifferent Ġprovider Ġ{}", Ġprovider . getName ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprovider . send Sms ( message ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatus ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ