From b1bbc50472b1d3d28eb6e0fe6048eae66baa77d1 Mon Sep 17 00:00:00 2001 From: Redkale <22250530@qq.com> Date: Tue, 17 Apr 2018 09:19:07 +0800 Subject: [PATCH] --- src/org/redkale/net/PrepareRunner.java | 9 ++++++--- src/org/redkale/net/ProtocolServer.java | 4 ++-- src/org/redkale/net/Response.java | 4 +++- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/org/redkale/net/PrepareRunner.java b/src/org/redkale/net/PrepareRunner.java index a264abdbd..08e130728 100644 --- a/src/org/redkale/net/PrepareRunner.java +++ b/src/org/redkale/net/PrepareRunner.java @@ -27,10 +27,13 @@ public final class PrepareRunner implements Runnable { private ByteBuffer data; - public PrepareRunner(Context context, AsyncConnection channel, ByteBuffer data) { + private Response response; + + public PrepareRunner(Context context, AsyncConnection channel, ByteBuffer data, Response response) { this.context = context; this.channel = channel; this.data = data; + this.response = response; } @Override @@ -38,7 +41,7 @@ public final class PrepareRunner implements Runnable { final PrepareServlet prepare = context.prepare; final ObjectPool responsePool = context.responsePool; if (data != null) { //BIO模式的UDP连接创建AsyncConnection时已经获取到ByteBuffer数据了 - final Response response = responsePool.get(); + if (response == null) response = responsePool.get(); response.init(channel); try { prepare.prepare(data, response.request, response); @@ -48,7 +51,7 @@ public final class PrepareRunner implements Runnable { } return; } - final Response response = responsePool.get(); + if (response == null) response = responsePool.get(); final ByteBuffer buffer = response.request.pollReadBuffer(); try { channel.read(buffer, null, new CompletionHandler() { diff --git a/src/org/redkale/net/ProtocolServer.java b/src/org/redkale/net/ProtocolServer.java index 57cdbdca9..72fe86e1c 100644 --- a/src/org/redkale/net/ProtocolServer.java +++ b/src/org/redkale/net/ProtocolServer.java @@ -123,7 +123,7 @@ public abstract class ProtocolServer { SocketAddress address = serchannel.receive(buffer); buffer.flip(); AsyncConnection conn = AsyncConnection.create(serchannel, address, false, readTimeoutSecond, writeTimeoutSecond); - context.runAsync(new PrepareRunner(context, conn, buffer)); + context.runAsync(new PrepareRunner(context, conn, buffer, null)); } catch (Exception e) { context.offerBuffer(buffer); } @@ -217,7 +217,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)); + context.runAsync(new PrepareRunner(context, conn, null, null)); } @Override diff --git a/src/org/redkale/net/Response.java b/src/org/redkale/net/Response.java index ebc4f0ee7..36ed0e803 100644 --- a/src/org/redkale/net/Response.java +++ b/src/org/redkale/net/Response.java @@ -184,7 +184,9 @@ public abstract class Response> { request.recycle(); if (channel != null) { if (keepAlive) { - this.context.runAsync(new PrepareRunner(context, channel, null)); + this.inited = false; + this.context.runAsync(new PrepareRunner(context, removeChannel(), null, this)); + return false; } else { try { if (channel.isOpen()) channel.close();