优化HttpResponse

This commit is contained in:
redkale
2023-06-25 22:43:31 +08:00
parent ff5b9a897a
commit 264dce055c
3 changed files with 48 additions and 166 deletions

View File

@@ -197,21 +197,6 @@ public class HttpMessageLocalClient extends HttpMessageClient {
this.future = future; this.future = future;
} }
@Override
public void finishJson(final Object obj) {
finish((Convert) null, (Type) null, obj);
}
@Override
public void finishJson(final Convert convert, final Object obj) {
finish(convert, (Type) null, obj);
}
@Override
public void finishJson(final Type type, final Object obj) {
finish((Convert) null, type, obj);
}
@Override @Override
public void finishJson(final Convert convert, final Type type, final Object obj) { public void finishJson(final Convert convert, final Type type, final Object obj) {
if (future == null) { if (future == null) {
@@ -220,11 +205,6 @@ public class HttpMessageLocalClient extends HttpMessageClient {
future.complete(obj); future.complete(obj);
} }
@Override
public void finish(Type type, org.redkale.service.RetResult ret) {
finish((Convert) null, type, ret);
}
@Override @Override
public void finish(final Convert convert, Type type, org.redkale.service.RetResult ret) { public void finish(final Convert convert, Type type, org.redkale.service.RetResult ret) {
if (future == null) { if (future == null) {

View File

@@ -12,7 +12,6 @@ import java.util.Arrays;
import java.util.function.*; import java.util.function.*;
import java.util.logging.Level; import java.util.logging.Level;
import org.redkale.convert.Convert; import org.redkale.convert.Convert;
import org.redkale.convert.json.JsonConvert;
import static org.redkale.mq.MessageRecord.CTYPE_HTTP_RESULT; import static org.redkale.mq.MessageRecord.CTYPE_HTTP_RESULT;
import org.redkale.net.Response; import org.redkale.net.Response;
import org.redkale.net.http.*; import org.redkale.net.http.*;
@@ -61,7 +60,7 @@ public class HttpMessageResponse extends HttpResponse {
type, this.message, this.callback, this.messageClient, this.producer, message.getRespTopic(), result); type, this.message, this.callback, this.messageClient, this.producer, message.getRespTopic(), result);
} }
public void finishHttpResult(Type type, Convert respConvert, HttpResult result) { public void finishHttpResult(Convert respConvert, Type type, HttpResult result) {
finishHttpResult(producer.logger.isLoggable(Level.FINEST), finishHttpResult(producer.logger.isLoggable(Level.FINEST),
respConvert == null ? ((HttpMessageRequest) this.request).getRespConvert() : respConvert, respConvert == null ? ((HttpMessageRequest) this.request).getRespConvert() : respConvert,
type, this.message, this.callback, this.messageClient, this.producer, message.getRespTopic(), result); type, this.message, this.callback, this.messageClient, this.producer, message.getRespTopic(), result);
@@ -115,34 +114,6 @@ public class HttpMessageResponse extends HttpResponse {
return rs; return rs;
} }
@Override
public void finishJson(final Object obj) {
finishJson((JsonConvert) null, (Type) null, obj);
}
@Override
public void finishJson(final Convert convert, final Object obj) {
if (message.isEmptyRespTopic()) {
if (callback != null) {
callback.run();
}
return;
}
finishHttpResult(obj.getClass(), convert, new HttpResult(obj));
}
@Override
public void finishJson(final Type type, final Object obj) {
if (message.isEmptyRespTopic()) {
if (callback != null) {
callback.run();
}
return;
}
finishHttpResult(type, new HttpResult(obj));
}
@Override @Override
public void finishJson(final Convert convert, final Type type, final Object obj) { public void finishJson(final Convert convert, final Type type, final Object obj) {
if (message.isEmptyRespTopic()) { if (message.isEmptyRespTopic()) {
@@ -151,30 +122,18 @@ public class HttpMessageResponse extends HttpResponse {
} }
return; return;
} }
finishHttpResult(type, convert, new HttpResult(obj)); finishHttpResult(convert, type, new HttpResult(obj));
} }
@Override @Override
public void finish(Type type, org.redkale.service.RetResult ret) { public void finish(final Convert convert, Type type, RetResult ret) {
if (message.isEmptyRespTopic()) { if (message.isEmptyRespTopic()) {
if (callback != null) { if (callback != null) {
callback.run(); callback.run();
} }
return; return;
} }
finish(type, new HttpResult(ret)); finishHttpResult(convert, type, new HttpResult(ret));
}
@Override
public void finish(final Convert convert, Type type, org.redkale.service.RetResult ret) {
if (message.isEmptyRespTopic()) {
if (callback != null) {
callback.run();
}
return;
}
finishHttpResult(type, convert, new HttpResult(ret));
} }
@Override @Override
@@ -185,7 +144,7 @@ public class HttpMessageResponse extends HttpResponse {
} }
return; return;
} }
finishHttpResult(type, convert, new HttpResult(obj)); finishHttpResult(convert, type, new HttpResult(obj));
} }
@Override @Override

View File

@@ -20,6 +20,7 @@ import java.util.logging.*;
import org.redkale.convert.*; import org.redkale.convert.*;
import org.redkale.convert.json.*; import org.redkale.convert.json.*;
import org.redkale.net.*; import org.redkale.net.*;
import org.redkale.service.RetResult;
import org.redkale.util.AnyValue.DefaultAnyValue; import org.redkale.util.AnyValue.DefaultAnyValue;
import org.redkale.util.AnyValue.Entry; import org.redkale.util.AnyValue.Entry;
import org.redkale.util.*; import org.redkale.util.*;
@@ -140,7 +141,7 @@ public class HttpResponse extends Response<HttpContext, HttpRequest> {
private BiConsumer<HttpResponse, byte[]> cacheHandler; private BiConsumer<HttpResponse, byte[]> cacheHandler;
private BiFunction<HttpRequest, org.redkale.service.RetResult, org.redkale.service.RetResult> retResultHandler; private BiFunction<HttpRequest, RetResult, RetResult> retResultHandler;
//------------------------------------------------ //------------------------------------------------
private final String plainContentType; private final String plainContentType;
@@ -181,7 +182,7 @@ public class HttpResponse extends Response<HttpContext, HttpRequest> {
protected final ConvertBytesHandler convertHandler = new ConvertBytesHandler() { protected final ConvertBytesHandler convertHandler = new ConvertBytesHandler() {
@Override @Override
public <A> void completed(byte[] bs, int offset, int length, Consumer<A> callback, A attachment) { public <A> void completed(byte[] bs, int offset, int length, Consumer<A> callback, A attachment) {
HttpResponse.this.finish(bs, offset, length, callback, attachment); finish(bs, offset, length, callback, attachment);
} }
}; };
@@ -355,19 +356,8 @@ public class HttpResponse extends Response<HttpContext, HttpRequest> {
* *
* @param obj 输出对象 * @param obj 输出对象
*/ */
public void finishJson(final Object obj) { public final void finishJson(final Object obj) {
this.contentType = this.jsonContentType; finishJson((Convert) null, (Type) null, obj);
if (this.recycleListener != null) {
this.output = obj;
}
Convert c = request.getRespConvert();
if (c == jsonRootConvert) {
JsonBytesWriter writer = jsonWriter;
c.convertTo(writer.clear(), obj);
finish(false, (String) null, writer.content(), writer.offset(), writer.length(), null, null);
} else {
c.convertToBytes(obj, convertHandler);
}
} }
/** /**
@@ -376,18 +366,8 @@ public class HttpResponse extends Response<HttpContext, HttpRequest> {
* @param convert 指定的JsonConvert * @param convert 指定的JsonConvert
* @param obj 输出对象 * @param obj 输出对象
*/ */
public void finishJson(final Convert convert, final Object obj) { public final void finishJson(final Convert convert, final Object obj) {
this.contentType = this.jsonContentType; finishJson(convert, (Type) null, obj);
if (this.recycleListener != null) {
this.output = obj;
}
if (convert == jsonRootConvert) {
JsonBytesWriter writer = jsonWriter;
convert.convertTo(writer.clear(), obj);
finish(false, (String) null, writer.content(), writer.offset(), writer.length(), null, null);
} else {
convert.convertToBytes(obj, convertHandler);
}
} }
/** /**
@@ -396,19 +376,8 @@ public class HttpResponse extends Response<HttpContext, HttpRequest> {
* @param type 指定的类型 * @param type 指定的类型
* @param obj 输出对象 * @param obj 输出对象
*/ */
public void finishJson(final Type type, final Object obj) { public final void finishJson(final Type type, final Object obj) {
this.contentType = this.jsonContentType; finishJson((Convert) null, type, obj);
if (this.recycleListener != null) {
this.output = obj;
}
Convert c = request.getRespConvert();
if (c == jsonRootConvert) {
JsonBytesWriter writer = jsonWriter;
c.convertTo(writer.clear(), type, obj);
finish(false, (String) null, writer.content(), writer.offset(), writer.length(), null, null);
} else {
c.convertToBytes(type, obj, convertHandler);
}
} }
/** /**
@@ -423,12 +392,14 @@ public class HttpResponse extends Response<HttpContext, HttpRequest> {
if (this.recycleListener != null) { if (this.recycleListener != null) {
this.output = obj; this.output = obj;
} }
if (convert == jsonRootConvert) { Convert c = convert == null ? request.getRespConvert() : convert;
Type t = type == null ? (obj == null ? null : obj.getClass()) : type;
if (c == jsonRootConvert) {
JsonBytesWriter writer = jsonWriter; JsonBytesWriter writer = jsonWriter;
convert.convertTo(writer.clear(), type, obj); c.convertTo(writer.clear(), t, obj);
finish(false, (String) null, writer.content(), writer.offset(), writer.length(), null, null); finish(false, (String) null, writer.content(), writer.offset(), writer.length(), null, null);
} else { } else {
convert.convertToBytes(type, obj, convertHandler); c.convertToBytes(t, obj, convertHandler);
} }
} }
@@ -450,7 +421,7 @@ public class HttpResponse extends Response<HttpContext, HttpRequest> {
* @param ret RetResult输出对象 * @param ret RetResult输出对象
*/ */
// @Deprecated //@since 2.5.0 // @Deprecated //@since 2.5.0
// public void finishJson(Type type, org.redkale.service.RetResult ret) { // public void finishJson(Type type, RetResult ret) {
// this.contentType = this.jsonContentType; // this.contentType = this.jsonContentType;
// if (this.retResultHandler != null) { // if (this.retResultHandler != null) {
// ret = this.retResultHandler.apply(this.request, ret); // ret = this.retResultHandler.apply(this.request, ret);
@@ -478,7 +449,7 @@ public class HttpResponse extends Response<HttpContext, HttpRequest> {
* @param ret RetResult输出对象 * @param ret RetResult输出对象
*/ */
// @Deprecated //@since 2.5.0 // @Deprecated //@since 2.5.0
// public void finishJson(final Convert convert, Type type, org.redkale.service.RetResult ret) { // public void finishJson(final Convert convert, Type type, RetResult ret) {
// this.contentType = this.jsonContentType; // this.contentType = this.jsonContentType;
// if (this.retResultHandler != null) { // if (this.retResultHandler != null) {
// ret = this.retResultHandler.apply(this.request, ret); // ret = this.retResultHandler.apply(this.request, ret);
@@ -514,34 +485,8 @@ public class HttpResponse extends Response<HttpContext, HttpRequest> {
* @param type 指定的RetResult泛型类型 * @param type 指定的RetResult泛型类型
* @param ret RetResult输出对象 * @param ret RetResult输出对象
*/ */
@SuppressWarnings("null") public final void finish(Type type, RetResult ret) {
public void finish(Type type, org.redkale.service.RetResult ret) { finish((Convert) null, type, ret);
if (this.retResultHandler != null) {
ret = this.retResultHandler.apply(this.request, ret);
}
if (this.recycleListener != null) {
this.output = ret;
}
if (ret != null && !ret.isSuccess()) {
this.header.addValue("retcode", String.valueOf(ret.getRetcode()));
this.header.addValue("retinfo", ret.getRetinfo());
}
Convert cc = ret == null ? null : ret.convert();
if (cc == null) {
cc = request.getRespConvert();
}
if (cc instanceof JsonConvert) {
this.contentType = this.jsonContentType;
} else if (cc instanceof TextConvert) {
this.contentType = this.plainContentType;
}
if (cc == jsonRootConvert) {
JsonBytesWriter writer = jsonWriter;
cc.convertTo(writer.clear(), type, ret);
finish(false, (String) null, writer.content(), writer.offset(), writer.length(), null, null);
} else {
cc.convertToBytes(type, ret, convertHandler);
}
} }
/** /**
@@ -552,7 +497,8 @@ public class HttpResponse extends Response<HttpContext, HttpRequest> {
* @param ret RetResult输出对象 * @param ret RetResult输出对象
*/ */
@SuppressWarnings("null") @SuppressWarnings("null")
public void finish(final Convert convert, Type type, org.redkale.service.RetResult ret) { public void finish(final Convert convert, Type type, RetResult ret) {
Objects.requireNonNull(type);
if (this.retResultHandler != null) { if (this.retResultHandler != null) {
ret = this.retResultHandler.apply(this.request, ret); ret = this.retResultHandler.apply(this.request, ret);
} }
@@ -590,8 +536,8 @@ public class HttpResponse extends Response<HttpContext, HttpRequest> {
* @param resultType HttpResult.result的泛型类型 * @param resultType HttpResult.result的泛型类型
* @param result HttpResult输出对象 * @param result HttpResult输出对象
*/ */
public void finish(Type resultType, HttpResult result) { public final void finish(Type resultType, HttpResult result) {
finish(request.getRespConvert(), resultType, result); finish((Convert) null, resultType, result);
} }
/** /**
@@ -626,8 +572,8 @@ public class HttpResponse extends Response<HttpContext, HttpRequest> {
* @param valueType CompletionFuture.value的泛型类型 * @param valueType CompletionFuture.value的泛型类型
* @param future CompletionStage输出对象 * @param future CompletionStage输出对象
*/ */
public void finishFuture(Type valueType, CompletionStage future) { public final void finishFuture(Type valueType, CompletionStage future) {
finishFuture(request.getRespConvert(), valueType, future); finishFuture((Convert) null, valueType, future);
} }
/** /**
@@ -658,7 +604,7 @@ public class HttpResponse extends Response<HttpContext, HttpRequest> {
* @param valueType CompletionFuture.value的泛型类型 * @param valueType CompletionFuture.value的泛型类型
* @param future CompletionStage输出对象 * @param future CompletionStage输出对象
*/ */
public void finishJsonFuture(Type valueType, CompletionStage future) { public final void finishJsonFuture(Type valueType, CompletionStage future) {
finishJsonFuture(request.getRespConvert(), valueType, future); finishJsonFuture(request.getRespConvert(), valueType, future);
} }
@@ -691,7 +637,7 @@ public class HttpResponse extends Response<HttpContext, HttpRequest> {
* @param valueType Publisher的泛型类型 * @param valueType Publisher的泛型类型
* @param publisher Publisher输出对象 * @param publisher Publisher输出对象
*/ */
public <T> void finishPublisher(Type valueType, Flow.Publisher<T> publisher) { public final <T> void finishPublisher(Type valueType, Flow.Publisher<T> publisher) {
finishPublisher(request.getRespConvert(), valueType, publisher); finishPublisher(request.getRespConvert(), valueType, publisher);
} }
@@ -703,7 +649,7 @@ public class HttpResponse extends Response<HttpContext, HttpRequest> {
* @param valueType Publisher的泛型类型 * @param valueType Publisher的泛型类型
* @param publisher Publisher输出对象 * @param publisher Publisher输出对象
*/ */
public <T> void finishPublisher(final Convert convert, Type valueType, Flow.Publisher<T> publisher) { public final <T> void finishPublisher(final Convert convert, Type valueType, Flow.Publisher<T> publisher) {
finishFuture(convert, valueType, (CompletionStage) Flows.createMonoFuture(publisher)); finishFuture(convert, valueType, (CompletionStage) Flows.createMonoFuture(publisher));
} }
@@ -713,8 +659,8 @@ public class HttpResponse extends Response<HttpContext, HttpRequest> {
* @param valueType Publisher的泛型类型 * @param valueType Publisher的泛型类型
* @param publisher Publisher输出对象 * @param publisher Publisher输出对象
*/ */
public void finishPublisher(Type valueType, Object publisher) { public final void finishPublisher(Type valueType, Object publisher) {
finishPublisher(request.getRespConvert(), valueType, publisher); finishPublisher((Convert) null, valueType, publisher);
} }
/** /**
@@ -724,7 +670,7 @@ public class HttpResponse extends Response<HttpContext, HttpRequest> {
* @param valueType Publisher的泛型类型 * @param valueType Publisher的泛型类型
* @param publisher Publisher输出对象 * @param publisher Publisher输出对象
*/ */
public void finishPublisher(final Convert convert, Type valueType, Object publisher) { public final void finishPublisher(final Convert convert, Type valueType, Object publisher) {
finishFuture(convert, valueType, (CompletionStage) Flows.maybePublisherToFuture(publisher)); finishFuture(convert, valueType, (CompletionStage) Flows.maybePublisherToFuture(publisher));
} }
@@ -733,8 +679,8 @@ public class HttpResponse extends Response<HttpContext, HttpRequest> {
* *
* @param future HttpScope输出异步对象 * @param future HttpScope输出异步对象
*/ */
public void finishScopeFuture(CompletionStage<HttpScope> future) { public final void finishScopeFuture(CompletionStage<HttpScope> future) {
finishScopeFuture(request.getRespConvert(), future); finishScopeFuture((Convert) null, future);
} }
/** /**
@@ -763,8 +709,8 @@ public class HttpResponse extends Response<HttpContext, HttpRequest> {
* *
* @param result HttpScope输出对象 * @param result HttpScope输出对象
*/ */
public void finish(HttpScope result) { public final void finish(HttpScope result) {
finish(request.getRespConvert(), result); finish((Convert) null, result);
} }
/** /**
@@ -797,9 +743,8 @@ public class HttpResponse extends Response<HttpContext, HttpRequest> {
* *
* @param obj 输出对象 * @param obj 输出对象
*/ */
@SuppressWarnings("unchecked") public final void finish(final Object obj) {
public void finish(final Object obj) { finish((Convert) null, (Type) null, obj);
finish(request.getRespConvert(), (Type) null, obj);
} }
/** /**
@@ -808,8 +753,7 @@ public class HttpResponse extends Response<HttpContext, HttpRequest> {
* @param convert 指定的Convert * @param convert 指定的Convert
* @param obj 输出对象 * @param obj 输出对象
*/ */
@SuppressWarnings("unchecked") public final void finish(final Convert convert, final Object obj) {
public void finish(final Convert convert, final Object obj) {
finish(convert, (Type) null, obj); finish(convert, (Type) null, obj);
} }
@@ -819,8 +763,7 @@ public class HttpResponse extends Response<HttpContext, HttpRequest> {
* @param type 指定的类型, 不一定是obj的数据类型必然obj为CompletableFuture type应该为Future的元素类型 * @param type 指定的类型, 不一定是obj的数据类型必然obj为CompletableFuture type应该为Future的元素类型
* @param obj 输出对象 * @param obj 输出对象
*/ */
@SuppressWarnings("unchecked") public final void finish(final Type type, Object obj) {
public void finish(final Type type, Object obj) {
finish((Convert) null, type, obj); finish((Convert) null, type, obj);
} }
@@ -845,7 +788,7 @@ public class HttpResponse extends Response<HttpContext, HttpRequest> {
} else if (cc instanceof TextConvert) { } else if (cc instanceof TextConvert) {
this.contentType = this.plainContentType; this.contentType = this.plainContentType;
} }
finish("null"); cc.convertToBytes(val, convertHandler);
} else if (val instanceof CompletionStage) { } else if (val instanceof CompletionStage) {
finishFuture(convert, val == obj ? type : null, (CompletionStage) val); finishFuture(convert, val == obj ? type : null, (CompletionStage) val);
} else if (val instanceof CharSequence) { } else if (val instanceof CharSequence) {
@@ -859,8 +802,8 @@ public class HttpResponse extends Response<HttpContext, HttpRequest> {
context.getLogger().log(Level.WARNING, "HttpServlet finish File occur, force to close channel. request = " + getRequest(), e); context.getLogger().log(Level.WARNING, "HttpServlet finish File occur, force to close channel. request = " + getRequest(), e);
finish(500, null); finish(500, null);
} }
} else if (val instanceof org.redkale.service.RetResult) { } else if (val instanceof RetResult) {
finish(convert, type, (org.redkale.service.RetResult) val); finish(convert, type, (RetResult) val);
} else if (val instanceof HttpResult) { } else if (val instanceof HttpResult) {
finish(convert, type, (HttpResult) val); finish(convert, type, (HttpResult) val);
} else if (val instanceof HttpScope) { } else if (val instanceof HttpScope) {
@@ -1574,7 +1517,7 @@ public class HttpResponse extends Response<HttpContext, HttpRequest> {
* *
* @return 拦截器 * @return 拦截器
*/ */
protected BiFunction<HttpRequest, org.redkale.service.RetResult, org.redkale.service.RetResult> getRetResultHandler() { protected BiFunction<HttpRequest, RetResult, RetResult> getRetResultHandler() {
return retResultHandler; return retResultHandler;
} }
@@ -1583,7 +1526,7 @@ public class HttpResponse extends Response<HttpContext, HttpRequest> {
* *
* @param retResultHandler 拦截器 * @param retResultHandler 拦截器
*/ */
public void retResultHandler(BiFunction<HttpRequest, org.redkale.service.RetResult, org.redkale.service.RetResult> retResultHandler) { public void retResultHandler(BiFunction<HttpRequest, RetResult, RetResult> retResultHandler) {
this.retResultHandler = retResultHandler; this.retResultHandler = retResultHandler;
} }