diff --git a/src/org/redkale/net/PrepareRunner.java b/src/org/redkale/net/PrepareRunner.java index 4b9e58c51..5bddbd827 100644 --- a/src/org/redkale/net/PrepareRunner.java +++ b/src/org/redkale/net/PrepareRunner.java @@ -61,7 +61,7 @@ public class PrepareRunner implements Runnable { @Override public void completed(Integer count, ByteBuffer buffer) { if (count < 1) { - channel.offerBuffer(buffer); + response.request.offerReadBuffer(buffer); channel.dispose();// response.init(channel); 在调用之前异常 response.removeChannel(); response.finish(true); @@ -85,7 +85,7 @@ public class PrepareRunner implements Runnable { @Override public void failed(Throwable exc, ByteBuffer buffer) { - channel.offerBuffer(buffer); + response.request.offerReadBuffer(buffer); channel.dispose();// response.init(channel); 在调用之前异常 response.removeChannel(); response.finish(true); @@ -116,7 +116,7 @@ public class PrepareRunner implements Runnable { if (buffer.hasRemaining()) { request.setMoredata(buffer); } else { - channel.offerBuffer(buffer); + response.request.offerReadBuffer(buffer); } preparer.prepare(request, response); } else { @@ -137,7 +137,7 @@ public class PrepareRunner implements Runnable { if (attachment.hasRemaining()) { request.setMoredata(attachment); } else { - channel.offerBuffer(attachment); + response.request.offerReadBuffer(attachment); } try { preparer.prepare(request, response); @@ -151,7 +151,7 @@ public class PrepareRunner implements Runnable { @Override public void failed(Throwable exc, ByteBuffer attachment) { preparer.illRequestCounter.incrementAndGet(); - channel.offerBuffer(attachment); + response.request.offerReadBuffer(attachment); response.finish(true); if (exc != null) request.context.logger.log(Level.FINER, "Servlet read channel erroneous, force to close channel ", exc); } @@ -175,4 +175,19 @@ public class PrepareRunner implements Runnable { return response.removeChannel(); } + protected ByteBuffer pollReadBuffer(Request request) { + return request.pollReadBuffer(); + } + + protected ByteBuffer pollReadBuffer(Response response) { + return response.request.pollReadBuffer(); + } + + protected void offerReadBuffer(Request request, ByteBuffer buffer) { + request.offerReadBuffer(buffer); + } + + protected void offerReadBuffer(Response response, ByteBuffer buffer) { + response.request.offerReadBuffer(buffer); + } } diff --git a/src/org/redkale/net/Request.java b/src/org/redkale/net/Request.java index 271f2ce6d..3f9ce8a23 100644 --- a/src/org/redkale/net/Request.java +++ b/src/org/redkale/net/Request.java @@ -37,6 +37,8 @@ public abstract class Request { protected AsyncConnection channel; + protected ByteBuffer readBuffer; + /** * properties 与 attributes 的区别在于:调用recycle时, attributes会被清空而properties会保留; * properties 通常存放需要永久绑定在request里的一些对象 @@ -47,6 +49,7 @@ public abstract class Request { protected Request(C context) { this.context = context; + this.readBuffer = context.pollBuffer(); this.bsonConvert = context.getBsonConvert(); this.jsonConvert = context.getJsonConvert(); } @@ -61,6 +64,23 @@ public abstract class Request { return rs; } + protected ByteBuffer pollReadBuffer() { + ByteBuffer buffer = this.readBuffer; + this.readBuffer = null; + if (buffer == null) buffer = context.pollBuffer(); + return buffer; + } + + protected void offerReadBuffer(ByteBuffer buffer) { + if (buffer == null) return; + if (this.readBuffer == null) { + buffer.clear(); + this.readBuffer = buffer; + } else { + context.offerBuffer(buffer); + } + } + /** * 返回值:Integer.MIN_VALUE: 帧数据; -1:数据不合法; 0:解析完毕; >0: 需再读取的字节数。 *