playframework - Play Framework handle request timeout -
how can handle timeout exception in play ws client? when specify requesttimeout , process stream, completionstage finishes though there exception.
see below example.
code (taken here):
// make request, should timeout completionstage<streamedresponse> futureresponse = ws.url("https://download.docker.com/mac/stable/docker.dmg") .setmethod("get").setrequesttimeout(1000) .stream(); completionstage<long> bytesreturned = futureresponse.thencompose(res -> { source<bytestring, ?> responsebody = res.getbody(); // count number of bytes returned sink<bytestring, completionstage<long>> bytessum = sink.fold(0l, (total, bytes) -> { long len = bytes.toarray().length; return total + len; }); return responsebody.runwith(bytessum, materializer); }).handle((res, err) -> { logger.info("res = {}, err = {}", res, err); return 200l; }).exceptionally(ex -> { logger.error("see exception"); return 100l; }); try { bytesreturned.tocompletablefuture().get(); logger.info("got response"); } catch (interruptedexception e) { // todo auto-generated catch block e.printstacktrace(); } catch (executionexception e) { // todo auto-generated catch block e.printstacktrace(); } logger.error("step completed"); i see in logs java.util.concurrent.timeoutexception , o.a.netty.timeout.timeouttimertask thrown, futureresponse completes successfully. there way catch error?
my problem trying return response user though controller , hangs because not data transmitted.
[debug] i.n.u.i.javassisttypeparametermatchergenerator - generated: io.netty.util.internal.__matchers__.org.asynchttpclient.httpresponsebodypartmatcher [debug] o.a.netty.channel.defaultchannelpool - closed 0 connections out of 0 in 0 ms [debug] o.a.netty.timeout.timeouttimertask - request timeout download.docker.com/52.84.239.124:443 after 1000 ms nettyresponsefuture{currentretry=0, isdone=0, iscancelled=0, asynchandler=play.api.libs.ws.ahc.streamed$defaultstreamedasynchandler@376665d1, nettyrequest=org.asynchttpclient.netty.request.nettyrequest@39a19d4d, future=java.util.concurrent.completablefuture@3d9e0ea1[not completed], uri=https://download.docker.com/mac/stable/docker.dmg, keepalive=true, redirectcount=0, timeoutsholder=org.asynchttpclient.netty.timeout.timeoutsholder@789c9776, inauth=0, statusreceived=1, touch=1491606083196} after 1075 ms [debug] o.a.netty.channel.channelmanager - closing channel [id: 0x66ec6bbd, l:/10.155.124.116:52337 - r:download.docker.com/52.84.239.124:443] [debug] o.a.netty.request.nettyrequestsender - aborting future nettyresponsefuture{currentretry=0, isdone=0, iscancelled=0, asynchandler=play.api.libs.ws.ahc.streamed$defaultstreamedasynchandler@376665d1, nettyrequest=org.asynchttpclient.netty.request.nettyrequest@39a19d4d, future=java.util.concurrent.completablefuture@3d9e0ea1[not completed], uri=https://download.docker.com/mac/stable/docker.dmg, keepalive=true, redirectcount=0, timeoutsholder=org.asynchttpclient.netty.timeout.timeoutsholder@789c9776, inauth=0, statusreceived=1, touch=1491606083196} [debug] o.a.netty.request.nettyrequestsender - request timeout download.docker.com/52.84.239.124:443 after 1000 ms java.util.concurrent.timeoutexception: request timeout download.docker.com/52.84.239.124:443 after 1000 ms @ org.asynchttpclient.netty.timeout.timeouttimertask.expire(timeouttimertask.java:43) @ org.asynchttpclient.netty.timeout.requesttimeouttimertask.run(requesttimeouttimertask.java:48) @ io.netty.util.hashedwheeltimer$hashedwheeltimeout.expire(hashedwheeltimer.java:588) @ io.netty.util.hashedwheeltimer$hashedwheelbucket.expiretimeouts(hashedwheeltimer.java:662) @ io.netty.util.hashedwheeltimer$worker.run(hashedwheeltimer.java:385) @ java.lang.thread.run(thread.java:745) [debug] o.a.netty.handler.httphandler - channel closed: [id: 0x66ec6bbd, l:/10.155.124.116:52337 ! r:download.docker.com/52.84.239.124:443] attribute instance [info] controllers.redirectcontroller - res = 2556824, err = null [info] controllers.redirectcontroller - got response [error] controllers.redirectcontroller - step completed
even facing timeout exception in play 1.2 api taking long time send response. able manually set timeout solved issue.
wsrequest request = ws.url(your_url).timeout("600s");
Comments
Post a Comment