import Ġorg . jetbrains . ktor . application .* Ċ import Ġorg . jetbrains . ktor . content .* Ċ import Ġorg . jetbrains . ktor . host .* Ċ import Ġorg . jetbrains . ktor . jetty .* Ċ import Ġorg . jetbrains . ktor . logging .* Ċ import Ġorg . jetbrains . ktor . routing .* Ċ import Ġorg . junit .* Ċ import Ġjava . net .* Ċ import Ġjava . util . concurrent .* Ċ import Ġkotlin . test .* ĊĊ Ċ fun ĠApplication . blocking Application () Ġ{ ĊĠĠĠ Ġrouting Ġ{ ĊĠĠĠĠĠĠĠ Ġget ("/") Ġ{ Ġcall Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Sleep ing ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTimeUnit . SECONDS . sleep ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond Write ( Charsets . ISO _ 8 8 5 9 _ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . write (" Help Ġ! ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠJet ty Dead lock Test Ġ{ ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Ignore ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġlong Ġintegration Ġtest ĊĠĠĠ Ġfun Ġtest Long Running With Sleep () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġport Ġ= Ġ 4 4 0 0 3 ĊĊĠĠĠĠĠĠĠ Ġval Ġenvironment Ġ= Ġapplication Host Environment Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnector Ġ{ Ġthis . port Ġ= Ġport Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodule ( Application :: blocking Application ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Ġ= ĠSL F 4 J Application Log (" ktor . test ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġjet ty Ġ= ĠJet ty Application Host ( environment ) ĊĠĠĠĠĠĠĠ Ġjet ty . start () ĊĊĠĠĠĠĠĠĠ Ġval Ġe Ġ= ĠExec utors . new Cached ThreadPool () ĊĠĠĠĠĠĠĠ Ġval Ġq Ġ= ĠLinked BlockingQueue < String >() ĊĊĠĠĠĠĠĠĠ Ġ// println (" starting ") ĊĠĠĠĠĠĠĠ Ġval Ġcon ns Ġ= Ġ( 0 .. 2 0 0 0 ). map Ġ{ Ġnumber Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . submit ( Callable < String > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠURL (" http :// localhost :$ port / "). open Connection (). inputStream . buffered Reader (). readLine (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// println ("$ number Ġsays Ġ$ this ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġ"< empty >" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" error : Ġ${ t . message }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġq . add ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// println (" Main Ġthread Ġis Ġwaiting Ġfor Ġresponses ") ĊĊĠĠĠĠĠĠĠ ĠTimeUnit . SECONDS . sleep ( 5 ) ĊĠĠĠĠĠĠĠ Ġvar Ġattempts Ġ= Ġ 7 ĊĊĠĠĠĠĠĠĠ Ġfun Ġdump () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( valid , Ġinvalid ) Ġ= Ġcon ns . filter Ġ{ Ġit . is Done Ġ}. partition Ġ{ Ġit . get () Ġ== Ġ" Help Ġ! " Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// println (" Completed : Ġ${ valid . size } Ġvalid , Ġ${ invalid . size } Ġinvalid Ġof Ġ${ valid . size Ġ+ Ġinvalid . size } Ġtotal Ġ[ attempts Ġ$ attempts ]") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdump () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( q . poll ( 5 , ĠTimeUnit . SECONDS ) Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( attempts Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattempts -- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattempts Ġ= Ġ 7 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdump () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( con ns . any Ġ{ Ġ! it . is Done Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTimeUnit . SECONDS . sleep ( 5 0 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertTrue Ġ{ Ġcon ns . all Ġ{ Ġit . is Done Ġ} Ġ} ĊĠĠĠ Ġ} ĊĊ Ċ }