diff --git a/src/main/java/org/redkale/net/client/Client.java b/src/main/java/org/redkale/net/client/Client.java index d2765ba13..084c97b9f 100644 --- a/src/main/java/org/redkale/net/client/Client.java +++ b/src/main/java/org/redkale/net/client/Client.java @@ -77,6 +77,9 @@ public abstract class Client, R extends ClientR protected int writeTimeoutSeconds; + // 是否非阻塞式, 非阻塞模式下不会在runWork里执行结果回调, 默认值: false + protected boolean nonBlocking; + // ------------------ 可选项 ------------------ // PING心跳的请求数据,为null且pingInterval<1表示不需要定时ping protected Supplier pingRequestSupplier; diff --git a/src/main/java/org/redkale/net/client/ClientCodec.java b/src/main/java/org/redkale/net/client/ClientCodec.java index 1f06c13a9..96a1644b2 100644 --- a/src/main/java/org/redkale/net/client/ClientCodec.java +++ b/src/main/java/org/redkale/net/client/ClientCodec.java @@ -149,11 +149,17 @@ public abstract class ClientCodec { + if (connection.client.nonBlocking) { Traces.currentTraceid(request.traceid); respFuture.complete(rs); Traces.removeTraceid(); - }); + } else { + workThread.runWork(() -> { + Traces.currentTraceid(request.traceid); + respFuture.complete(rs); + Traces.removeTraceid(); + }); + } } else { // 异常 workThread.runWork(() -> { Traces.currentTraceid(request.traceid); diff --git a/src/main/java/org/redkale/net/http/HttpContext.java b/src/main/java/org/redkale/net/http/HttpContext.java index d2835fecf..c2065d103 100644 --- a/src/main/java/org/redkale/net/http/HttpContext.java +++ b/src/main/java/org/redkale/net/http/HttpContext.java @@ -46,12 +46,17 @@ public class HttpContext extends Context { // 延迟解析header protected final boolean lazyHeader; + // pipeline模式下是否相同header + // deprecated + final boolean sameHeader; + // 不带通配符的mapping url的缓存对象 final Map[] uriPathCaches = new Map[100]; public HttpContext(HttpContextConfig config) { super(config); this.lazyHeader = config.lazyHeader; + this.sameHeader = config.sameHeader; this.remoteAddrHeader = config.remoteAddrHeader; this.remoteAddrHeaders = config.remoteAddrHeaders; this.localHeader = config.localHeader; @@ -233,9 +238,12 @@ public class HttpContext extends Context { } public static class HttpContextConfig extends ContextConfig { + // 是否延迟解析http-header public boolean lazyHeader; + public boolean sameHeader; + public String remoteAddrHeader; // 用逗号隔开的多个header diff --git a/src/main/java/org/redkale/net/http/HttpRequest.java b/src/main/java/org/redkale/net/http/HttpRequest.java index a69f58fe3..89a0d92cc 100644 --- a/src/main/java/org/redkale/net/http/HttpRequest.java +++ b/src/main/java/org/redkale/net/http/HttpRequest.java @@ -39,9 +39,6 @@ import static org.redkale.util.Utility.isNotEmpty; */ public class HttpRequest extends Request { - private static final boolean PIPELINE_SAME_HEADERS = - Boolean.getBoolean("redkale.http.request.pipeline.sameheaders"); - protected static final Serializable CURRUSERID_NIL = new Serializable() {}; protected static final int READ_STATE_ROUTE = 1; @@ -202,7 +199,8 @@ public class HttpRequest extends Request { final HttpRpcAuthenticator rpcAuthenticator; - HttpServlet.ActionEntry actionEntry; // 仅供HttpServlet传递Entry使用 + // 仅供HttpServlet传递Entry使用 + HttpServlet.ActionEntry actionEntry; public HttpRequest(HttpContext context) { this(context, new ByteArray()); @@ -1217,7 +1215,7 @@ public class HttpRequest extends Request { @Override protected HttpRequest copyHeader() { - if (!PIPELINE_SAME_HEADERS || !context.lazyHeader) { + if (!context.sameHeader || !context.lazyHeader) { return null; } HttpRequest req = new HttpRequest(context, this.body); diff --git a/src/main/java/org/redkale/net/http/HttpServer.java b/src/main/java/org/redkale/net/http/HttpServer.java index 4abbbc371..40244fad2 100644 --- a/src/main/java/org/redkale/net/http/HttpServer.java +++ b/src/main/java/org/redkale/net/http/HttpServer.java @@ -101,7 +101,7 @@ public class HttpServer extends Server getHttpServlets() { @@ -399,6 +399,7 @@ public class HttpServer extends Server defaultSetHeaders = new ArrayList<>(); boolean autoOptions = false; boolean lazyHeader = false; + boolean sameHeader = false; int datePeriod = 0; String plainContentType = null; String jsonContentType = null; @@ -409,10 +410,10 @@ public class HttpServer extends Server 0"); this.notContainSQL = @@ -154,7 +153,9 @@ public abstract class AbstractDataSqlSource extends AbstractDataSource this.tablecopySQL = readConfProps.getProperty( DATA_SOURCE_TABLECOPY_SQLTEMPLATE, "CREATE TABLE IF NOT EXISTS #{newtable} LIKE #{oldtable}"); + this.autoDDL = "true".equals(readConfProps.getProperty(DATA_SOURCE_TABLE_AUTODDL, "false")); this.cacheForbidden = "NONE".equalsIgnoreCase(readConfProps.getProperty(DATA_SOURCE_CACHEMODE)); + this.clientNonBlocking = "true".equalsIgnoreCase(readConfProps.getProperty(DATA_SOURCE_NON_BLOCKING, "false")); this.slowmsWarn = Integer.parseInt( readConfProps.getProperty(DATA_SOURCE_SLOWMS_WARN, "2000").trim()); this.slowmsError = Integer.parseInt( @@ -375,6 +376,15 @@ public abstract class AbstractDataSqlSource extends AbstractDataSource } } + @Override + protected void complete(WorkThread workThread, CompletableFuture future, T value) { + if (clientNonBlocking) { + future.complete(value); + } else { + super.complete(workThread, future, value); + } + } + protected void updateOneResourceChange(Properties newProps, ResourceEvent[] events) { throw new UnsupportedOperationException("Not supported yet."); } diff --git a/src/main/java/org/redkale/source/DataSources.java b/src/main/java/org/redkale/source/DataSources.java index cc3e07bfd..f19b3a560 100644 --- a/src/main/java/org/redkale/source/DataSources.java +++ b/src/main/java/org/redkale/source/DataSources.java @@ -62,7 +62,10 @@ public final class DataSources { // @since 2.8.0 //超过多少毫秒视为较慢, 会打印警告级别的日志, 默认值: 3000 public static final String DATA_SOURCE_SLOWMS_ERROR = "error-slowms"; - + + // @since 2.8.0 //是否非阻塞式 + public static final String DATA_SOURCE_NON_BLOCKING = "non-blocking"; + // @since 2.8.0 //sourceExecutor线程数, 默认值: 内核数 public static final String DATA_SOURCE_THREADS = "threads";