Response优化finish方法

This commit is contained in:
Redkale
2023-01-15 21:11:59 +08:00
parent 39ade6f3ab
commit 19c8ffb79d
11 changed files with 40 additions and 66 deletions

View File

@@ -323,7 +323,7 @@ public class HttpMessageLocalClient extends HttpMessageClient {
}
@Override
public void finish(boolean kill, ByteBuffer buffer) {
public void finishBuffer(boolean kill, ByteBuffer buffer) {
if (future == null) {
return;
}
@@ -333,7 +333,7 @@ public class HttpMessageLocalClient extends HttpMessageClient {
}
@Override
public void finish(boolean kill, ByteBuffer... buffers) {
public void finishBuffers(boolean kill, ByteBuffer... buffers) {
if (future == null) {
return;
}

View File

@@ -293,7 +293,7 @@ public class HttpMessageResponse extends HttpResponse {
}
@Override
public void finish(boolean kill, ByteBuffer buffer) {
public void finishBuffer(boolean kill, ByteBuffer buffer) {
if (message.isEmptyRespTopic()) {
if (callback != null) {
callback.run();
@@ -306,7 +306,7 @@ public class HttpMessageResponse extends HttpResponse {
}
@Override
public void finish(boolean kill, ByteBuffer... buffers) {
public void finishBuffers(boolean kill, ByteBuffer... buffers) {
if (message.isEmptyRespTopic()) {
if (callback != null) {
callback.run();

View File

@@ -190,7 +190,6 @@ public class AsyncIOThread extends WorkThread {
key.interestOps(key.interestOps() & ~SelectionKey.OP_CONNECT);
conn.doConnect();
} else if (conn.readCompletionHandler != null && key.isReadable()) {
conn.currReadInvoker = 0;
key.interestOps(key.interestOps() & ~SelectionKey.OP_READ);
conn.doRead(true);
} else if (conn.writeCompletionHandler != null && key.isWritable()) {
@@ -199,7 +198,6 @@ public class AsyncIOThread extends WorkThread {
}
} else {
if (conn.readCompletionHandler != null && key.isReadable()) {
conn.currReadInvoker = 0;
key.interestOps(key.interestOps() & ~SelectionKey.OP_READ); //不放开这行在CompletableFuture时容易ReadPending
conn.doRead(true);
} else if (conn.writeCompletionHandler != null && key.isWritable()) {

View File

@@ -26,8 +26,6 @@ import org.redkale.util.ByteBufferWriter;
*/
abstract class AsyncNioConnection extends AsyncConnection {
protected static final int MAX_INVOKER_ONSTACK = Integer.getInteger("redkale.net.invoker.max.onstack", 16);
final AsyncIOThread connectThread;
protected SocketAddress remoteAddress;
@@ -46,8 +44,6 @@ abstract class AsyncNioConnection extends AsyncConnection {
protected int readTimeoutSeconds;
int currReadInvoker;
protected ByteBuffer readByteBuffer;
protected CompletionHandler<Integer, ByteBuffer> readCompletionHandler;
@@ -134,7 +130,6 @@ abstract class AsyncNioConnection extends AsyncConnection {
@Override
protected void startRead(CompletionHandler<Integer, ByteBuffer> handler) {
currReadInvoker = MAX_INVOKER_ONSTACK;
read(handler);
}
@@ -159,11 +154,6 @@ abstract class AsyncNioConnection extends AsyncConnection {
this.readCompletionHandler = handler;
}
doRead(this.ioReadThread.inCurrThread());
// if (client) {
// doRead(this.ioReadThread.inCurrThread());
// } else {
// doRead(this.ioReadThread.inCurrThread() || currReadInvoker < MAX_INVOKER_ONSTACK); //同一线程中Selector.wakeup无效
// }
}
@Override
@@ -264,7 +254,6 @@ abstract class AsyncNioConnection extends AsyncConnection {
this.readtime = System.currentTimeMillis();
int readCount = 0;
if (direct) {
currReadInvoker++;
if (this.readByteBuffer == null) {
this.readByteBuffer = sslEngine == null ? pollReadBuffer() : pollReadSSLBuffer();
if (this.readTimeoutSeconds > 0) {

View File

@@ -134,7 +134,7 @@ public class Context {
}
} catch (Throwable t) {
response.context.logger.log(Level.WARNING, "execute servlet abort, force to close channel ", t);
response.error();
response.error(t);
}
});
} else if (workExecutor != null) {
@@ -144,7 +144,7 @@ public class Context {
servlet.execute(request, response);
} catch (Throwable t) {
response.context.logger.log(Level.WARNING, "execute servlet abort, force to close channel ", t);
response.error();
response.error(t);
}
});
} else {
@@ -153,7 +153,7 @@ public class Context {
servlet.execute(request, response);
} catch (Throwable t) {
response.context.logger.log(Level.WARNING, "execute servlet abort, force to close channel ", t);
response.error();
response.error(t);
}
}

View File

@@ -254,7 +254,7 @@ public abstract class DispatcherServlet<K extends Serializable, C extends Contex
response.nextEvent();
} catch (Throwable t) {
response.context.logger.log(Level.WARNING, "prepare servlet abort, force to close channel ", t);
response.error();
response.error(t);
}
}

View File

@@ -81,7 +81,7 @@ class ProtocolCodec implements CompletionHandler<Integer, ByteBuffer> {
decode(buffer, response, 0, null);
} catch (Throwable t) { //此处不可 context.offerBuffer(buffer); 以免prepare.prepare内部异常导致重复 offerBuffer
context.logger.log(Level.WARNING, "prepare servlet abort, force to close channel ", t);
response.finish(true);
response.error(t);
}
}
@@ -102,7 +102,7 @@ class ProtocolCodec implements CompletionHandler<Integer, ByteBuffer> {
decode(data, response, 0, null);
} catch (Throwable t) {
context.logger.log(Level.WARNING, "prepare servlet abort, force to close channel ", t);
response.finish(true);
response.error(t);
}
return;
}
@@ -123,7 +123,7 @@ class ProtocolCodec implements CompletionHandler<Integer, ByteBuffer> {
decode(data, response, 0, null);
} catch (Throwable t) {
context.logger.log(Level.WARNING, "prepare servlet abort, force to close channel ", t);
response.finish(true);
response.error(t);
}
return;
}
@@ -148,7 +148,7 @@ class ProtocolCodec implements CompletionHandler<Integer, ByteBuffer> {
if (rs != Integer.MIN_VALUE) {
preparer.incrIllegalRequestCounter();
}
response.finish(true);
response.error(null);
if (context.logger.isLoggable(Level.FINEST)) {
context.logger.log(Level.FINEST, "request.readHeader erroneous (" + rs + "), force to close channel ");
}
@@ -177,7 +177,7 @@ class ProtocolCodec implements CompletionHandler<Integer, ByteBuffer> {
decode(buffer, pipelineResponse, pindex + 1, hreq);
} catch (Throwable t) { //此处不可 offerBuffer(buffer); 以免prepare.prepare内部异常导致重复 offerBuffer
context.logger.log(Level.WARNING, "prepare pipeline servlet abort, force to close channel ", t);
pipelineResponse.finish(true);
pipelineResponse.error(t);
}
}
} else {
@@ -199,7 +199,7 @@ class ProtocolCodec implements CompletionHandler<Integer, ByteBuffer> {
public void failed(Throwable exc, ByteBuffer attachment) {
context.prepare.incrIllegalRequestCounter();
channel.offerReadBuffer(attachment);
response.finish(true);
response.error(exc);
if (exc != null) {
request.context.logger.log(Level.FINER, "Servlet read channel erroneous, force to close channel ", exc);
}

View File

@@ -49,21 +49,21 @@ public abstract class Response<C extends Context, R extends Request<C>> {
private final ByteBuffer writeBuffer;
private final CompletionHandler finishBytesHandler = new CompletionHandler<Integer, Void>() {
protected final CompletionHandler finishBytesHandler = new CompletionHandler<Integer, Void>() {
@Override
public void completed(Integer result, Void attachment) {
finish();
finishInIOThread();
}
@Override
public void failed(Throwable exc, Void attachment) {
finish(true);
finishInIOThread(true);
}
};
private final CompletionHandler finishBufferHandler = new CompletionHandler<Integer, ByteBuffer>() {
protected final CompletionHandler finishBufferHandler = new CompletionHandler<Integer, ByteBuffer>() {
@Override
public void completed(Integer result, ByteBuffer attachment) {
@@ -72,7 +72,7 @@ public abstract class Response<C extends Context, R extends Request<C>> {
} else {
attachment.clear();
}
finish();
finishInIOThread();
}
@Override
@@ -82,7 +82,7 @@ public abstract class Response<C extends Context, R extends Request<C>> {
} else {
attachment.clear();
}
finish(true);
finishInIOThread(true);
}
};
@@ -96,7 +96,7 @@ public abstract class Response<C extends Context, R extends Request<C>> {
channel.offerWriteBuffer(attachment);
}
}
finish();
finishInIOThread();
}
@Override
@@ -106,7 +106,7 @@ public abstract class Response<C extends Context, R extends Request<C>> {
channel.offerWriteBuffer(attachment);
}
}
finish(true);
finishInIOThread(true);
}
};
@@ -201,15 +201,15 @@ public abstract class Response<C extends Context, R extends Request<C>> {
return !this.inited;
}
public void finish() {
this.finish(false);
private void finishInIOThread() {
this.finishInIOThread(false);
}
protected void error() {
finish(true);
protected void error(Throwable t) {
finishInIOThread(true);
}
public void finish(boolean kill) {
private void finishInIOThread(boolean kill) {
if (!this.inited) {
return; //避免重复关闭
} //System.println("耗时: " + (System.currentTimeMillis() - request.createtime));
@@ -318,15 +318,15 @@ public abstract class Response<C extends Context, R extends Request<C>> {
}
}
protected final void finish(ByteBuffer buffer) {
finish(false, buffer);
protected final void finishBuffer(ByteBuffer buffer) {
finishBuffers(false, buffer);
}
protected final void finish(ByteBuffer... buffers) {
finish(false, buffers);
protected final void finishBuffers(ByteBuffer... buffers) {
finishBuffers(false, buffers);
}
protected void finish(boolean kill, ByteBuffer buffer) {
protected void finishBuffer(boolean kill, ByteBuffer buffer) {
if (!this.inited) {
return; //避免重复关闭
}
@@ -351,7 +351,7 @@ public abstract class Response<C extends Context, R extends Request<C>> {
}
}
protected void finish(boolean kill, ByteBuffer... buffers) {
protected void finishBuffers(boolean kill, ByteBuffer... buffers) {
if (!this.inited) {
return; //避免重复关闭
}

View File

@@ -177,19 +177,6 @@ public class HttpResponse extends Response<HttpContext, HttpRequest> {
private final JsonBytesWriter jsonWriter = new JsonBytesWriter();
protected final CompletionHandler<Integer, Void> pipelineWriteHandler = new CompletionHandler<Integer, Void>() {
@Override
public void completed(Integer result, Void attachment) {
finish();
}
@Override
public void failed(Throwable exc, Void attachment) {
finish(true);
}
};
@SuppressWarnings("Convert2Lambda")
protected final ConvertBytesHandler convertHandler = new ConvertBytesHandler() {
@Override
@@ -964,7 +951,7 @@ public class HttpResponse extends Response<HttpContext, HttpRequest> {
boolean over = this.channel.writePipelineData(pipelineIndex, request.getPipelineCount(), data);
if (over) {
request.setPipelineCompleted(true);
this.channel.flushPipelineData(this.pipelineWriteHandler);
this.channel.flushPipelineData(this.finishBytesHandler);
} else {
removeChannel();
this.responseConsumer.accept(this);
@@ -972,7 +959,7 @@ public class HttpResponse extends Response<HttpContext, HttpRequest> {
} else {
if (this.channel.hasPipelineData()) {
this.channel.writePipelineData(pipelineIndex, request.getPipelineCount(), data);
this.channel.flushPipelineData(this.pipelineWriteHandler);
this.channel.flushPipelineData(this.finishBytesHandler);
} else {
//不能用finish(boolean kill, final ByteTuple array) 否则会调this.finish
super.finish(false, data.content(), 0, data.length());
@@ -981,7 +968,7 @@ public class HttpResponse extends Response<HttpContext, HttpRequest> {
}
@Override
protected void error() {
protected void error(Throwable t) {
finish500();
}
@@ -1337,7 +1324,7 @@ public class HttpResponse extends Response<HttpContext, HttpRequest> {
fileChannel.close();
} catch (IOException ie) {
}
finish();
finishBytesHandler.completed(result, attachment);
return;
}
if (fileChannel == null) {

View File

@@ -70,7 +70,7 @@ public class SncpDispatcherServlet extends DispatcherServlet<Uint128, SncpContex
@Override
public void execute(SncpRequest request, SncpResponse response) throws IOException {
if (request.isPing()) {
response.finish(false, Sncp.PONG_BUFFER.duplicate());
response.finishBuffer(false, Sncp.PONG_BUFFER.duplicate());
return;
}
SncpServlet servlet = (SncpServlet) mappingServlet(request.getServiceid());

View File

@@ -68,8 +68,8 @@ public class SncpResponse extends Response<SncpContext, SncpRequest> {
}
@Override
protected void finish(boolean kill, ByteBuffer buffer) {
super.finish(kill, buffer);
protected void finishBuffer(boolean kill, ByteBuffer buffer) {
super.finishBuffer(kill, buffer);
}
public void finish(final int retcode, final BsonWriter out) {