From 86fde5612914b251f6575cc86f10f1ee74cf7c0a Mon Sep 17 00:00:00 2001 From: Redkale <8730487+redkale@users.noreply.github.com> Date: Wed, 20 Jan 2021 18:15:25 +0800 Subject: [PATCH] =?UTF-8?q?Convert=E5=A2=9E=E5=8A=A0convertMapToBytes?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/org/redkale/convert/Convert.java | 2 + src/org/redkale/convert/bson/BsonConvert.java | 11 ++++ src/org/redkale/convert/json/JsonConvert.java | 11 ++++ src/org/redkale/net/NioThread.java | 1 - src/org/redkale/net/Response.java | 2 + src/org/redkale/net/http/HttpResponse.java | 60 +++++++++++++++---- 6 files changed, 75 insertions(+), 12 deletions(-) diff --git a/src/org/redkale/convert/Convert.java b/src/org/redkale/convert/Convert.java index 1f7298a5e..3a10c333f 100644 --- a/src/org/redkale/convert/Convert.java +++ b/src/org/redkale/convert/Convert.java @@ -65,6 +65,8 @@ public abstract class Convert { public abstract ByteBuffer[] convertTo(final Supplier supplier, final Type type, final Object value); + public abstract byte[] convertMapToBytes(final Object... values); + public abstract ByteBuffer[] convertMapTo(final Supplier supplier, final Object... values); } diff --git a/src/org/redkale/convert/bson/BsonConvert.java b/src/org/redkale/convert/bson/BsonConvert.java index f5da0303a..1f19d3745 100644 --- a/src/org/redkale/convert/bson/BsonConvert.java +++ b/src/org/redkale/convert/bson/BsonConvert.java @@ -247,6 +247,17 @@ public class BsonConvert extends BinaryConvert { return out.toBuffers(); } + @Override + public byte[] convertMapToBytes(final Object... values) { + BsonWriter out = pollBsonWriter(); + if (values == null) { + out.writeNull(); + } else { + ((AnyEncoder) factory.getAnyEncoder()).convertMapTo(out, values); + } + return out.toArray(); + } + @Override public ByteBuffer[] convertMapTo(final Supplier supplier, final Object... values) { if (supplier == null) return null; diff --git a/src/org/redkale/convert/json/JsonConvert.java b/src/org/redkale/convert/json/JsonConvert.java index 4e2cb3fd5..9f13ab628 100644 --- a/src/org/redkale/convert/json/JsonConvert.java +++ b/src/org/redkale/convert/json/JsonConvert.java @@ -366,6 +366,17 @@ public class JsonConvert extends TextConvert { return out.toBuffers(); } + @Override + public byte[] convertMapToBytes(final Object... values) { + JsonWriter out = pollJsonWriter(); + if (values == null) { + out.writeNull(); + } else { + ((AnyEncoder) factory.getAnyEncoder()).convertMapTo(out, values); + } + return out.toBytes(); + } + @Override public ByteBuffer[] convertMapTo(final Supplier supplier, final Object... values) { if (supplier == null) return null; diff --git a/src/org/redkale/net/NioThread.java b/src/org/redkale/net/NioThread.java index d150d82ce..b03acb7ee 100644 --- a/src/org/redkale/net/NioThread.java +++ b/src/org/redkale/net/NioThread.java @@ -10,7 +10,6 @@ import java.nio.channels.*; import java.util.*; import java.util.concurrent.*; import java.util.function.Consumer; -import org.redkale.net.*; import org.redkale.util.*; /** diff --git a/src/org/redkale/net/Response.java b/src/org/redkale/net/Response.java index 95521632c..4b79923b6 100644 --- a/src/org/redkale/net/Response.java +++ b/src/org/redkale/net/Response.java @@ -25,6 +25,8 @@ import org.redkale.util.ObjectPool; @SuppressWarnings("unchecked") public abstract class Response> { + protected static final boolean respConvertByBuffer = Boolean.getBoolean("resp.convert.bytebuffer"); + protected final C context; protected final ObjectPool responsePool; //虚拟构建的Response可能不存在responsePool diff --git a/src/org/redkale/net/http/HttpResponse.java b/src/org/redkale/net/http/HttpResponse.java index 910b6aef2..0965c7000 100644 --- a/src/org/redkale/net/http/HttpResponse.java +++ b/src/org/redkale/net/http/HttpResponse.java @@ -327,7 +327,11 @@ public class HttpResponse extends Response { public void finishMapJson(final Object... objs) { this.contentType = this.jsonContentType; if (this.recycleListener != null) this.output = objs; - finish(request.getRespConvert().convertMapTo(getBodyBufferSupplier(), objs)); + if (respConvertByBuffer) { + finish(request.getRespConvert().convertMapTo(getBodyBufferSupplier(), objs)); + } else { + finish(request.getRespConvert().convertMapToBytes(objs)); + } } /** @@ -339,7 +343,11 @@ public class HttpResponse extends Response { public void finishJson(final JsonConvert convert, final Object obj) { this.contentType = this.jsonContentType; if (this.recycleListener != null) this.output = obj; - finish(convert.convertTo(getBodyBufferSupplier(), obj)); + if (respConvertByBuffer) { + finish(convert.convertTo(getBodyBufferSupplier(), obj)); + } else { + finish(convert.convertToBytes(obj)); + } } /** @@ -352,7 +360,11 @@ public class HttpResponse extends Response { public void finishMapJson(final JsonConvert convert, final Object... objs) { this.contentType = this.jsonContentType; if (this.recycleListener != null) this.output = objs; - finish(convert.convertMapTo(getBodyBufferSupplier(), objs)); + if (respConvertByBuffer) { + finish(convert.convertMapTo(getBodyBufferSupplier(), objs)); + } else { + finish(convert.convertMapToBytes(objs)); + } } /** @@ -364,7 +376,11 @@ public class HttpResponse extends Response { public void finishJson(final Type type, final Object obj) { this.contentType = this.jsonContentType; this.output = obj; - finish(request.getRespConvert().convertTo(getBodyBufferSupplier(), type, obj)); + if (respConvertByBuffer) { + finish(request.getRespConvert().convertTo(getBodyBufferSupplier(), type, obj)); + } else { + finish(request.getRespConvert().convertToBytes(type, obj)); + } } /** @@ -377,7 +393,11 @@ public class HttpResponse extends Response { public void finishJson(final JsonConvert convert, final Type type, final Object obj) { this.contentType = this.jsonContentType; if (this.recycleListener != null) this.output = obj; - finish(convert.convertTo(getBodyBufferSupplier(), type, obj)); + if (respConvertByBuffer) { + finish(convert.convertTo(getBodyBufferSupplier(), type, obj)); + } else { + finish(convert.convertToBytes(type, obj)); + } } /** @@ -388,7 +408,11 @@ public class HttpResponse extends Response { public void finishJson(final Object... objs) { this.contentType = this.jsonContentType; if (this.recycleListener != null) this.output = objs; - finish(request.getRespConvert().convertTo(getBodyBufferSupplier(), objs)); + if (respConvertByBuffer) { + finish(request.getRespConvert().convertTo(getBodyBufferSupplier(), objs)); + } else { + finish(request.getRespConvert().convertToBytes(objs)); + } } /** @@ -408,7 +432,11 @@ public class HttpResponse extends Response { } Convert convert = ret == null ? null : ret.convert(); if (convert == null) convert = request.getRespConvert(); - finish(convert.convertTo(getBodyBufferSupplier(), ret)); + if (respConvertByBuffer) { + finish(convert.convertTo(getBodyBufferSupplier(), ret)); + } else { + finish(convert.convertToBytes(ret)); + } } /** @@ -427,7 +455,11 @@ public class HttpResponse extends Response { this.header.addValue("retcode", String.valueOf(ret.getRetcode())); this.header.addValue("retinfo", ret.getRetinfo()); } - finish(convert.convertTo(getBodyBufferSupplier(), ret)); + if (respConvertByBuffer) { + finish(convert.convertTo(getBodyBufferSupplier(), ret)); + } else { + finish(convert.convertToBytes(ret)); + } } /** @@ -575,13 +607,19 @@ public class HttpResponse extends Response { this.header.addValue("retcode", String.valueOf(ret.getRetcode())).addValue("retinfo", ret.getRetinfo()); } } + if (this.channel == null) { //虚拟的HttpResponse finish(type == null ? convert.convertToBytes(obj) : convert.convertToBytes(type, obj)); return; } - ByteBuffer[] buffers = type == null ? convert.convertTo(getBodyBufferSupplier(), obj) - : convert.convertTo(getBodyBufferSupplier(), type, obj); - finish(buffers); + if (respConvertByBuffer) { + ByteBuffer[] buffers = type == null ? convert.convertTo(getBodyBufferSupplier(), obj) + : convert.convertTo(getBodyBufferSupplier(), type, obj); + finish(buffers); + } else { + byte[] bs = type == null ? convert.convertToBytes(obj) : convert.convertToBytes(type, obj); + finish(bs); + } } }