From bcbc6ccb679b5f6792a3d59f6ad04e97a00a6df2 Mon Sep 17 00:00:00 2001 From: nmihajlovski Date: Mon, 11 Jul 2016 15:46:56 -0700 Subject: [PATCH] Async error handling. --- .../src/main/java/org/rapidoid/http/Req.java | 5 ++++ .../handler/AbstractAsyncHttpHandler.java | 8 +++---- .../http/handler/StaticResourcesHandler.java | 3 +-- .../java/org/rapidoid/http/impl/HttpIO.java | 24 ++++++++++++------- .../java/org/rapidoid/http/impl/ReqImpl.java | 12 ++++++++++ 5 files changed, 37 insertions(+), 15 deletions(-) diff --git a/rapidoid-http-fast/src/main/java/org/rapidoid/http/Req.java b/rapidoid-http-fast/src/main/java/org/rapidoid/http/Req.java index 85755cc7cb..ada193afbf 100644 --- a/rapidoid-http-fast/src/main/java/org/rapidoid/http/Req.java +++ b/rapidoid-http-fast/src/main/java/org/rapidoid/http/Req.java @@ -340,4 +340,9 @@ public interface Req { */ Customization custom(); + /** + * Reverts the previous processing of the request, usually with intention to process the same request again. + */ + void revert(); + } diff --git a/rapidoid-http-fast/src/main/java/org/rapidoid/http/handler/AbstractAsyncHttpHandler.java b/rapidoid-http-fast/src/main/java/org/rapidoid/http/handler/AbstractAsyncHttpHandler.java index a9ccac2fac..712789bb54 100644 --- a/rapidoid-http-fast/src/main/java/org/rapidoid/http/handler/AbstractAsyncHttpHandler.java +++ b/rapidoid-http-fast/src/main/java/org/rapidoid/http/handler/AbstractAsyncHttpHandler.java @@ -76,8 +76,7 @@ public HttpStatus handle(Channel ctx, boolean isKeepAlive, Req req, Object extra txMode = before(req, username, roles); } catch (Throwable e) { - HttpIO.errorAndDone(req, e); - return HttpStatus.DONE; + return HttpIO.errorAndDone(req, e); } U.notNull(txMode, "transactionMode"); @@ -88,8 +87,7 @@ public HttpStatus handle(Channel ctx, boolean isKeepAlive, Req req, Object extra } catch (Throwable e) { // if there was an error in the job scheduling: - HttpIO.errorAndDone(req, e); - return HttpStatus.DONE; + return HttpIO.errorAndDone(req, e); } return HttpStatus.ASYNC; @@ -212,7 +210,7 @@ public void run() { } private Object wrap(final Channel channel, final boolean isKeepAlive, final Req req, final int index, final Object extra) - throws Exception { + throws Exception { HttpWrapper wrapper = wrappers[index]; HandlerInvocation invocation = new HandlerInvocation() { diff --git a/rapidoid-http-fast/src/main/java/org/rapidoid/http/handler/StaticResourcesHandler.java b/rapidoid-http-fast/src/main/java/org/rapidoid/http/handler/StaticResourcesHandler.java index 1fa25e070b..fab355f8a4 100644 --- a/rapidoid-http-fast/src/main/java/org/rapidoid/http/handler/StaticResourcesHandler.java +++ b/rapidoid-http-fast/src/main/java/org/rapidoid/http/handler/StaticResourcesHandler.java @@ -62,8 +62,7 @@ public HttpStatus handle(Channel ctx, boolean isKeepAlive, Req req, Object extra return HttpStatus.NOT_FOUND; } catch (Exception e) { - HttpIO.errorAndDone(req, e); - return HttpStatus.DONE; + return HttpIO.errorAndDone(req, e); } } diff --git a/rapidoid-http-fast/src/main/java/org/rapidoid/http/impl/HttpIO.java b/rapidoid-http-fast/src/main/java/org/rapidoid/http/impl/HttpIO.java index 2ed2a86752..888c71fa34 100644 --- a/rapidoid-http-fast/src/main/java/org/rapidoid/http/impl/HttpIO.java +++ b/rapidoid-http-fast/src/main/java/org/rapidoid/http/impl/HttpIO.java @@ -8,11 +8,9 @@ import org.rapidoid.commons.MediaType; import org.rapidoid.data.BufRange; import org.rapidoid.data.JSON; -import org.rapidoid.http.HttpResponseCodes; -import org.rapidoid.http.HttpUtils; -import org.rapidoid.http.Req; -import org.rapidoid.http.Resp; +import org.rapidoid.http.*; import org.rapidoid.http.customize.Customization; +import org.rapidoid.job.Jobs; import org.rapidoid.log.Log; import org.rapidoid.net.abstracts.Channel; import org.rapidoid.render.Template; @@ -127,10 +125,20 @@ public static void error(final Req req, final Throwable error) { } } - public static void errorAndDone(Req req, Throwable error) { - error(req, error); - // the Req object will do the rendering - req.done(); + public static HttpStatus errorAndDone(final Req req, final Throwable error) { + req.revert(); + req.async(); + + Jobs.execute(new Runnable() { + @Override + public void run() { + error(req, error); + // the Req object will do the rendering + req.done(); + } + }); + + return HttpStatus.ASYNC; } public static void writeContentLengthAndBody(Channel ctx, byte[] content) { diff --git a/rapidoid-http-fast/src/main/java/org/rapidoid/http/impl/ReqImpl.java b/rapidoid-http-fast/src/main/java/org/rapidoid/http/impl/ReqImpl.java index 200979df08..d29cecd277 100644 --- a/rapidoid-http-fast/src/main/java/org/rapidoid/http/impl/ReqImpl.java +++ b/rapidoid-http-fast/src/main/java/org/rapidoid/http/impl/ReqImpl.java @@ -582,6 +582,7 @@ public Customization custom() { @Override public Req async() { this.async = true; + channel.async(); return this; } @@ -730,4 +731,15 @@ public boolean isStopped() { return stopped; } + @Override + public void revert() { + rendering = false; + posConLen = 0; + posBefore = 0; + async = false; + done = false; + completed = false; + response = null; + } + }