HI All,
I came across a strange issue happening with akka http on request timeout
which i cannot understand, can some body help me with it?
Consider following code in akka 2.4.9:
import akka.NotUsed
import akka.actor.ActorSystem
import akka.http.scaladsl.Http
import akka.http.scaladsl.model.{HttpRequest, HttpResponse}
import akka.http.scaladsl.server.Directives._
import akka.stream.{ActorMaterializer, FlowShape}
import akka.stream.scaladsl.GraphDSL.Implicits._
import akka.stream.scaladsl.{Broadcast, Flow, GraphDSL, Zip}
import scala.concurrent.Future
object Test extends App {
implicit val actorSystem = ActorSystem()
implicit val ec = actorSystem.dispatcher
implicit val materializer = ActorMaterializer()
def routes =
(path("test1") & get) {
complete("result1")
} ~
(path("test2") & get) {
complete {
Future {
Thread.sleep(30000)
"result2"
}
}
}
def processRequest(route: Flow[HttpRequest, HttpResponse, NotUsed]):
Flow[HttpRequest, HttpResponse, NotUsed] =
new ExtendedFlow(route).extend()
val serverSource = Http().bindAndHandle(processRequest(routes), "0.0.0.0",
port = 11011)
}
final class ExtendedFlow[A, B](originalFlow: Flow[A, B, NotUsed]) {
def extend(): Flow[A, B, NotUsed] =
Flow.fromGraph {
GraphDSL.create() { implicit builder =>
val in = builder.add(Flow[A].map { e => println("in " + e); e })
val broadcast = builder.add(Broadcast[A](2))
val zip = builder.add(Zip[A, B]())
val out = builder.add(Flow[(A, B)].map { o => println("out " + o); o._2
})
in ~> broadcast; broadcast.out(0) ~> zip.in0
broadcast.out(1) ~> originalFlow ~> zip.in1; zip.out
~> out
FlowShape(in.in, out.out)
}
}
}
Now if i execute `curl -v "http://localhost:11011/test1"` i correctly see 'in'
and 'out' print statements in console and "result1" sent to user.
My actual confusion is when i execute `curl -v "http://localhost:11011/test2"`.
In this case after 20s (default request timeout in akka http)
HttpServerBluePrint sends 503 back to user with a message that server was not
able to produce response in time.
Later, in 30s, future completes as well, result of it i guess is ignored as
response from client was already handled.
Question here is what actually happening to the extended flow in this
situation?
I don`t see any output from sent from zip.out, though i see 'in' statement
printed for test2. Seeing this i would assume either:
1. Flow would stuck eventually or
2. Flow would produce wrong pairs in zip commit from next request elements.
>From my observations flow keeps working without any problems/exceptions and
>produce correct pair in zip?
Anyone can shed some light what is actually going on here?
Regards,
Kyrylo
--
>>>>>>>>>> Read the docs: http://akka.io/docs/
>>>>>>>>>> Check the FAQ:
>>>>>>>>>> http://doc.akka.io/docs/akka/current/additional/faq.html
>>>>>>>>>> Search the archives: https://groups.google.com/group/akka-user
---
You received this message because you are subscribed to the Google Groups "Akka
User List" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/akka-user.
For more options, visit https://groups.google.com/d/optout.