优化Response.channel.write
This commit is contained in:
@@ -107,8 +107,9 @@ class AsyncNioTcpProtocolServer extends ProtocolServer {
|
|||||||
return pool == null ? safeResponsePool.get() : pool.get();
|
return pool == null ? safeResponsePool.get() : pool.get();
|
||||||
};
|
};
|
||||||
this.responseConsumer = (v) -> {
|
this.responseConsumer = (v) -> {
|
||||||
if (Thread.currentThread() != v.thread && v.thread != null) {
|
WorkThread thread = v.channel != null ? v.channel.getAsyncIOThread() : v.thread;
|
||||||
v.thread.execute(() -> {
|
if (thread != null && !thread.inCurrThread()) {
|
||||||
|
thread.execute(() -> {
|
||||||
ObjectPool<Response> pool = localResponsePool.get();
|
ObjectPool<Response> pool = localResponsePool.get();
|
||||||
(pool == null ? safeResponsePool : pool).accept(v);
|
(pool == null ? safeResponsePool : pool).accept(v);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -47,6 +47,8 @@ public abstract class Response<C extends Context, R extends Request<C>> {
|
|||||||
|
|
||||||
protected Servlet<C, R, ? extends Response<C, R>> servlet;
|
protected Servlet<C, R, ? extends Response<C, R>> servlet;
|
||||||
|
|
||||||
|
protected final ByteBuffer writeBuffer;
|
||||||
|
|
||||||
private final CompletionHandler finishBytesHandler = new CompletionHandler<Integer, Void>() {
|
private final CompletionHandler finishBytesHandler = new CompletionHandler<Integer, Void>() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -65,13 +67,21 @@ public abstract class Response<C extends Context, R extends Request<C>> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void completed(Integer result, ByteBuffer attachment) {
|
public void completed(Integer result, ByteBuffer attachment) {
|
||||||
|
if (attachment != writeBuffer) {
|
||||||
channel.offerBuffer(attachment);
|
channel.offerBuffer(attachment);
|
||||||
|
} else {
|
||||||
|
attachment.clear();
|
||||||
|
}
|
||||||
finish();
|
finish();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void failed(Throwable exc, ByteBuffer attachment) {
|
public void failed(Throwable exc, ByteBuffer attachment) {
|
||||||
|
if (attachment != writeBuffer) {
|
||||||
channel.offerBuffer(attachment);
|
channel.offerBuffer(attachment);
|
||||||
|
} else {
|
||||||
|
attachment.clear();
|
||||||
|
}
|
||||||
finish(true);
|
finish(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -105,6 +115,7 @@ public abstract class Response<C extends Context, R extends Request<C>> {
|
|||||||
this.context = context;
|
this.context = context;
|
||||||
this.request = request;
|
this.request = request;
|
||||||
this.thread = WorkThread.currWorkThread();
|
this.thread = WorkThread.currWorkThread();
|
||||||
|
this.writeBuffer = context != null ? ByteBuffer.allocateDirect(context.getBufferCapacity()) : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected AsyncConnection removeChannel() {
|
protected AsyncConnection removeChannel() {
|
||||||
@@ -217,7 +228,11 @@ public abstract class Response<C extends Context, R extends Request<C>> {
|
|||||||
AsyncConnection conn = removeChannel();
|
AsyncConnection conn = removeChannel();
|
||||||
if (conn != null && conn.protocolCodec != null) {
|
if (conn != null && conn.protocolCodec != null) {
|
||||||
this.responseConsumer.accept(this);
|
this.responseConsumer.accept(this);
|
||||||
|
if (conn.inCurrThread()) {
|
||||||
conn.read(conn.protocolCodec);
|
conn.read(conn.protocolCodec);
|
||||||
|
} else {
|
||||||
|
conn.execute(() -> conn.read(conn.protocolCodec));
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
Supplier<Response> poolSupplier = this.responseSupplier;
|
Supplier<Response> poolSupplier = this.responseSupplier;
|
||||||
Consumer<Response> poolConsumer = this.responseConsumer;
|
Consumer<Response> poolConsumer = this.responseConsumer;
|
||||||
@@ -269,10 +284,18 @@ public abstract class Response<C extends Context, R extends Request<C>> {
|
|||||||
finishBytesHandler.failed(exc, attachment);
|
finishBytesHandler.failed(exc, attachment);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
} else {
|
||||||
|
ByteBuffer buffer = this.writeBuffer;
|
||||||
|
if (buffer != null && buffer.capacity() >= length) {
|
||||||
|
buffer.clear();
|
||||||
|
buffer.put(bs, offset, length);
|
||||||
|
buffer.flip();
|
||||||
|
this.channel.write(buffer, buffer, finishBufferHandler);
|
||||||
} else {
|
} else {
|
||||||
this.channel.write(bs, offset, length, finishBytesHandler);
|
this.channel.write(bs, offset, length, finishBytesHandler);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public <A> void finish(boolean kill, final byte[] bs, int offset, int length, final byte[] bs2, int offset2, int length2, Consumer<A> callback, A attachment) {
|
public <A> void finish(boolean kill, final byte[] bs, int offset, int length, final byte[] bs2, int offset2, int length2, Consumer<A> callback, A attachment) {
|
||||||
if (!this.inited) {
|
if (!this.inited) {
|
||||||
|
|||||||
Reference in New Issue
Block a user