package Ġwf . g arn ier . reactor fun Ċ Ċ import Ġreactor . block h ound . Block H ound Ċ import Ġreactor . block h ound . integration . Block H ound Integration Ċ import Ġreactor . cache . Cache Mono Ċ import Ġreactor . core . publisher . Flux Ċ import Ġreactor . core . publisher . Mono Ċ import Ġreactor . core . publisher . Signal Ċ import Ġreactor . core . scheduler . Reactor Block H ound Integration Ċ import Ġreactor . netty . http . client . HttpClient Ċ import Ġreactor . netty . resources . Net ty Block H ound Integration Ċ import Ġjava . util . concurrent . Concurrent HashMap Ċ import Ġjava . util . concurrent . Concurrent Map ĊĊ Ċ // private Ġval Ġwf . g arn ier . reactor fun . getClient Ġ= ĠHttpClient . create (). baseUrl (" https :// sw api . co /") Ċ private Ġval Ġclient Ġ= ĠHttpClient . create (). baseUrl (" http :// localhost : 8 0 8 0 /") Ċ const Ġval Ġlu ke Url Ġ= Ġ"/ api / people / 1 /" Ċ Ċ fun Ġmain () Ġ{ ĊĠĠĠ ĠBlock H ound . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with ( Reactor Block H ound Integration ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with ( Net ty Block H ound Integration ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with ( Custom Integration ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. install () ĊĠĠĠ Ġprintln (" Listing ĠChar acters Ġin ĠMov ies Ġ! ") ĊĊĠĠĠ Ġval Ġfil ms Ġ= Ġget Person ( lu ke Url ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Iterable Ġ{ Ġit . fil ms Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġget Film ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġget Characters For Film ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Iterable () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. join ToString ("\ n \ n \ n ") ĊĊĠĠĠ Ġprintln ( fil ms ) Ċ } Ċ Ċ class ĠCustom Integration Ġ: ĠBlock H ound Integration Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġapply To ( builder : ĠBlock H ound . Builder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbuilder ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. allow Blocking Calls Inside (" sun . security . ssl . Hand sh aker ", Ġ" kick start ") Ġ// Ġnet ty ĠSSL Ġstuff ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. allow Blocking Calls Inside (" sun . security . ssl . Hand sh aker ", Ġ" process Loop ") Ġ// Ġnet ty ĠSSL Ġstuff ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. allow Blocking Calls Inside (" com . fasterxml . jackson . databind . util . Class Util ", Ġ" get PackageName ") ĠĠĠ Ġ// Ġj ack son ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. allow Blocking Calls Inside (" java . io . Print Stream ", Ġ" println ") Ġ// Ġkotlin 's Ġprintln Ġfor Ġdo On Next Ġ& Ġstuff ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. allow Blocking Calls Inside (" Characters Who Play ed With Lu ke Kt ", Ġ" wf . g arn ier . reactor fun . un marshal Person ") Ġ// Ġweird Ġun marshall ing Ġerrors ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġget Characters For Film ( base Film : ĠFil m ): ĠMono < Film > Ġ{ ĊĠĠĠ Ġreturn ĠFlux . from Iterable ( base Film . characters ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Person ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Next Ġ{ Ġp Ġ-> Ġprintln (" Got Ġ${ p . name } Ġfor Ġfilm Ġ${ base Film . title }") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . name Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠFil m ( base Film . title , Ġbase Film . url , Ġit ) Ġ} Ċ } ĊĊ Ċ val Ġcache : ĠConcurrent Map < String , Ġin ĠSignal < out ĠPerson >> Ġ= ĠConcurrent HashMap () Ċ private Ġfun Ġget Person ( url : ĠString ): ĠMono < Person > Ġ{ ĊĠĠĠ Ġreturn ĠCache Mono . lookup ( cache , Ġurl ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Cache Miss Resume ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient . get () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. uri ( url ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. response Content () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. aggregate () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. asString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġunmarshal Person ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Next Ġ{ Ġp Ġ-> Ġprintln (" REQUEST ED Ġ${ p . name }") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ċ } Ċ Ċ private Ġfun Ġget Film ( url : ĠString ): ĠMono < Film > Ġ{ ĊĠĠĠ Ġreturn Ġclient . get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. uri ( url ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. response Content () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. aggregate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. asString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġmapper . readValue ( it , ĠFil m :: class . java ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Next Ġ{ Ġprintln (" Got Ġfilm : Ġ${ it . title }") Ġ} Ċ } ĊĊ Ċ val Ġsimple Cache : ĠConcurrent Map < String , ĠMono < Person >> Ġ= ĠConcurrent HashMap (); Ċ private Ġfun Ġget Person 2 ( url : ĠString ): ĠMono < Person > Ġ{ ĊĠĠĠ Ġreturn Ġsimple Cache . get Or Put ( url , Ġ{ ĊĠĠĠĠĠĠĠ Ġclient . get () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. uri ( url ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. response Content () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. aggregate () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. asString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġunmarshal Person ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Next Ġ{ Ġp Ġ-> Ġprintln (" REQUEST ED Ġ${ p . name }") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. cache () ĊĠĠĠ Ġ}) Ċ } Ċ Ċ private Ġfun Ġunmarshal Person ( it : ĠString ?) Ġ= Ġmapper . readValue < Person >( it , ĠPerson :: class . java )