diff --git a/src/org/redkale/net/PrepareRunner.java b/src/org/redkale/net/PrepareRunner.java index db615992f..5d5701107 100644 --- a/src/org/redkale/net/PrepareRunner.java +++ b/src/org/redkale/net/PrepareRunner.java @@ -26,24 +26,23 @@ public final class PrepareRunner implements Runnable { private final Context context; + private final boolean keepAlive; + private ByteBuffer data; - private Response response; - - public PrepareRunner(Context context, AsyncConnection channel, ByteBuffer data, Response response) { + public PrepareRunner(Context context, AsyncConnection channel, ByteBuffer data, boolean keepAlive) { this.context = context; this.channel = channel; this.data = data; - this.response = response; + this.keepAlive = keepAlive; } @Override public void run() { - final boolean keepalive = response != null; final PrepareServlet prepare = context.prepare; final ObjectPool responsePool = context.responsePool; + final Response response = responsePool.get(); if (data != null) { //BIO模式的UDP连接创建AsyncConnection时已经获取到ByteBuffer数据了 - if (response == null) response = responsePool.get(); try { response.init(channel); prepare.prepare(data, response.request, response); @@ -53,10 +52,9 @@ public final class PrepareRunner implements Runnable { } return; } - if (response == null) response = responsePool.get(); final ByteBuffer buffer = response.request.pollReadBuffer(); try { - channel.read(buffer, keepalive ? context.getAliveTimeoutSeconds() : 0, TimeUnit.SECONDS, null, + channel.read(buffer, keepAlive ? context.getAliveTimeoutSeconds() : 0, TimeUnit.SECONDS, null, new CompletionHandler() { @Override public void completed(Integer count, Void attachment1) { diff --git a/src/org/redkale/net/ProtocolServer.java b/src/org/redkale/net/ProtocolServer.java index ceeb8b848..b9520c536 100644 --- a/src/org/redkale/net/ProtocolServer.java +++ b/src/org/redkale/net/ProtocolServer.java @@ -150,7 +150,7 @@ public abstract class ProtocolServer { SocketAddress address = serchannel.receive(buffer); buffer.flip(); AsyncConnection conn = AsyncConnection.create(serchannel, address, false, readTimeoutSeconds, writeTimeoutSeconds); - context.runAsync(new PrepareRunner(context, conn, buffer, null)); + context.runAsync(new PrepareRunner(context, conn, buffer, false)); } catch (Exception e) { context.offerBuffer(buffer); } @@ -244,7 +244,7 @@ public abstract class ProtocolServer { AsyncConnection conn = AsyncConnection.create(channel, null, context); conn.livingCounter = livingCounter; conn.closedCounter = closedCounter; - context.runAsync(new PrepareRunner(context, conn, null, null)); + context.runAsync(new PrepareRunner(context, conn, null, false)); } @Override diff --git a/src/org/redkale/net/Response.java b/src/org/redkale/net/Response.java index 059ac8ba5..b88e40453 100644 --- a/src/org/redkale/net/Response.java +++ b/src/org/redkale/net/Response.java @@ -170,21 +170,13 @@ public abstract class Response> { protected boolean recycle() { if (!inited) return false; boolean keepAlive = request.keepAlive; - if (recycleListener != null) { - try { - recycleListener.accept(request, this); - } catch (Exception e) { - context.logger.log(Level.WARNING, "Response.recycleListener error, request = " + request, e); - } - recycleListener = null; - } this.output = null; this.filter = null; this.servlet = null; request.recycle(); if (channel != null) { if (keepAlive) { - this.context.runAsync(new PrepareRunner(context, channel, null, null)); + this.context.runAsync(new PrepareRunner(context, channel, null, keepAlive)); } else { try { if (channel.isOpen()) channel.close(); @@ -255,6 +247,14 @@ public abstract class Response> { if (!this.inited) return; //避免重复关闭 //System.println("耗时: " + (System.currentTimeMillis() - request.createtime)); if (kill) refuseAlive(); + if (this.recycleListener != null) { + try { + this.recycleListener.accept(request, this); + } catch (Exception e) { + context.logger.log(Level.WARNING, "Response.recycleListener error, request = " + request, e); + } + this.recycleListener = null; + } this.context.responsePool.accept(this); } diff --git a/src/org/redkale/net/http/HttpResponse.java b/src/org/redkale/net/http/HttpResponse.java index f1da63de3..a2d40e4d5 100644 --- a/src/org/redkale/net/http/HttpResponse.java +++ b/src/org/redkale/net/http/HttpResponse.java @@ -179,7 +179,6 @@ public class HttpResponse extends Response { @Override protected boolean recycle() { - boolean rs = super.recycle(); this.status = 200; this.contentLength = -1; this.contentType = null; @@ -187,7 +186,7 @@ public class HttpResponse extends Response { this.headsended = false; this.header.clear(); this.bufferHandler = null; - return rs; + return super.recycle(); } @Override