package Ġdev . pel let . integration Ċ Ċ import Ġdev . pel let . P el let Builder . pel let Server Ċ import Ġdev . pel let . P el let Connector Ċ import Ġdev . pel let . logging . logger Ċ import Ġdev . pel let . routing . http . HTTP Route Response Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Supervisor Job Ċ import Ġkotlinx . coroutines . async Ċ import Ġkotlinx . coroutines . channels . Channel Ċ import Ġkotlinx . coroutines . delay Ċ import Ġkotlinx . coroutines . future . await Ċ import Ġkotlinx . coroutines . isActive Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġkotlinx . coroutines . yield Ċ import Ġokhttp 3 . Call Ċ import Ġokhttp 3 . Callback Ċ import Ġokhttp 3 . Connection Pool Ċ import Ġokhttp 3 . Ok HttpClient Ċ import Ġokhttp 3 . Request Ċ import Ġokhttp 3 . Response Ċ import Ġjava . io . IOException Ċ import Ġjava . time . Duration Ċ import Ġjava . time . Instant Ċ import Ġjava . util . concurrent . Comp letableFuture Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġjava . util . concurrent . atomic . Atomic Integer Ċ import Ġkotlin . test . Test Ċ Ċ class ĠNo Content Benchmark Test Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= Ġlogger < No Content Benchmark Test >() ĊĠĠĠ Ġprivate Ġval ĠnumberOf Requests Ġ= ĠSystem . getProperty (" benchmark . requests . total ") ?. toInt OrNull () Ġ?: Ġ 1 _ 0 0 0 _ 0 0 0 ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` benchmark Ġno Ġcontent Ġresponse `() Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcounter Ġ= ĠAtomicInteger ( numberOf Requests ) ĊĠĠĠĠĠĠĠ Ġval Ġpel let Ġ= Ġpel let Server Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhttp Connector Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġendpoint Ġ= ĠPel let Connector . Endpoint ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" 1 2 7 . 0 . 0 . 1 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 9 0 0 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrouter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget ("/") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcounter . decrement AndGet () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHTTP Route Response . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. no Content () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġjob Ġ= Ġpel let . start () ĊĊĠĠĠĠĠĠĠ Ġval Ġclient Ġ= ĠOk HttpClient (). newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. connection Pool ( Connection Pool ( 3 0 , Ġ 1 L , ĠTimeUnit . MIN UTES )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġclient . dispatcher . max Requests Per Host Ġ= Ġ 3 0 ĊĠĠĠĠĠĠĠ Ġclient . connection Pool . connection Count () ĊĠĠĠĠĠĠĠ Ġlogger . info (" sending Ġ${ counter . get ()} Ġrequests ...") ĊĊĠĠĠĠĠĠĠ Ġval Ġdispatcher Ġ= ĠDispatch ers . Default ĊĠĠĠĠĠĠĠ Ġval Ġchannel Ġ= ĠChannel < Request >() ĊĠĠĠĠĠĠĠ Ġval Ġsupervisor Ġ= ĠSuper visor Job () ĊĠĠĠĠĠĠĠ Ġval Ġscope Ġ= ĠCor outine Scope ( dispatcher Ġ+ Ġsupervisor ) ĊĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠnumberOf Requests . down To ( 0 ). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠRequest . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. url (" http :// 1 2 7 . 0 . 0 . 1 : 9 0 0 1 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchannel . send ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġprocessor Count Ġ= ĠRuntime . get Runtime (). available Processors () ĊĠĠĠĠĠĠĠ Ġval ĠstartTime Ġ= ĠInstant . now () ĊĠĠĠĠĠĠĠ Ġprocessor Count . down To ( 0 ). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope . async Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Requests ( client , Ġchannel ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġscope . async Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( this . isActive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġcounter . get () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( count Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsupervisor . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ async ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" completed Ġ$ count ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 0 0 0 L ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. join () ĊĠĠĠĠĠĠĠ Ġjob . cancel () ĊĊĠĠĠĠĠĠĠ Ġval ĠendTime Ġ= ĠInstant . now () ĊĠĠĠĠĠĠĠ Ġval Ġtime Elapsed Ms Ġ= ĠDuration . between ( startTime , ĠendTime ). to Millis () ĊĠĠĠĠĠĠĠ Ġval Ġr ps Ġ= Ġ( numberOf Requests Ġ/ Ġtime Elapsed Ms . toDouble ()) Ġ* Ġ 1 0 0 0 L ĊĠĠĠĠĠĠĠ Ġlogger . info (" completed Ġr ps : Ġ$ r ps ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun ĠCor outine Scope . send Requests ( ĊĠĠĠĠĠĠĠ Ġclient : ĠOk HttpClient , ĊĠĠĠĠĠĠĠ Ġchannel : ĠChannel < Request > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile Ġ( this . isActive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġchannel . receive () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfuture Ġ= ĠCompletableFuture < Response >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . new Call ( request ). enqueue ( to Callback ( future )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġfuture . await () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( response . code Ġ== Ġ 2 0 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġyield () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġto Callback ( future : ĠCompletableFuture < Response >): ĠCallback Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠCallback Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( call : ĠCall , Ġe : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfuture . complete Exception ally ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Response ( call : ĠCall , Ġresponse : ĠResponse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfuture . complete ( response ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ