格式化
This commit is contained in:
@@ -42,7 +42,8 @@ public final class ApiDocCommand {
|
|||||||
|
|
||||||
private static final java.lang.reflect.Type TYPE_RETRESULT_LONG = new TypeToken<RetResult<Long>>() {}.getType();
|
private static final java.lang.reflect.Type TYPE_RETRESULT_LONG = new TypeToken<RetResult<Long>>() {}.getType();
|
||||||
|
|
||||||
private final Application app; // Application全局对象
|
// Application全局对象
|
||||||
|
private final Application app;
|
||||||
|
|
||||||
public ApiDocCommand(Application app) {
|
public ApiDocCommand(Application app) {
|
||||||
this.app = app;
|
this.app = app;
|
||||||
|
|||||||
@@ -43,27 +43,38 @@ public final class ClassFilter<T> {
|
|||||||
|
|
||||||
private Predicate<String> expectPredicate;
|
private Predicate<String> expectPredicate;
|
||||||
|
|
||||||
private boolean refused; // 是否拒绝所有数据,设置true,则其他规则失效,都是拒绝.
|
// 是否拒绝所有数据,设置true,则其他规则失效,都是拒绝.
|
||||||
|
private boolean refused;
|
||||||
|
|
||||||
private Class superClass; // 符合的父类型。不为空时,扫描结果的class必须是superClass的子类
|
// 符合的父类型。不为空时,扫描结果的class必须是superClass的子类
|
||||||
|
private Class superClass;
|
||||||
|
|
||||||
private Class[] excludeSuperClasses; // 不符合的父类型。
|
// 不符合的父类型。
|
||||||
|
private Class[] excludeSuperClasses;
|
||||||
|
|
||||||
private Class<? extends Annotation> annotationClass; // 符合的注解。不为空时,扫描结果的class必须包含该注解
|
// 符合的注解。不为空时,扫描结果的class必须包含该注解
|
||||||
|
private Class<? extends Annotation> annotationClass;
|
||||||
|
|
||||||
private Pattern[] includePatterns; // 符合的className正则表达式
|
// 符合的className正则表达式
|
||||||
|
private Pattern[] includePatterns;
|
||||||
|
|
||||||
private Pattern[] excludePatterns; // 拒绝的className正则表达式
|
// 拒绝的className正则表达式
|
||||||
|
private Pattern[] excludePatterns;
|
||||||
|
|
||||||
private Set<String> privilegeIncludes; // 特批符合条件的className
|
// 特批符合条件的className
|
||||||
|
private Set<String> privilegeIncludes;
|
||||||
|
|
||||||
private Set<String> privilegeExcludes; // 特批拒绝条件的className
|
// 特批拒绝条件的className
|
||||||
|
private Set<String> privilegeExcludes;
|
||||||
|
|
||||||
private List<ClassFilter> ors; // 或关系的其他ClassFilter
|
// 或关系的其他ClassFilter
|
||||||
|
private List<ClassFilter> ors;
|
||||||
|
|
||||||
private List<ClassFilter> ands; // 与关系的其他ClassFilter
|
// 与关系的其他ClassFilter
|
||||||
|
private List<ClassFilter> ands;
|
||||||
|
|
||||||
private AnyValue conf; // 基本配置信息, 当符合条件时将conf的属性赋值到FilterEntry中去。
|
// 基本配置信息, 当符合条件时将conf的属性赋值到FilterEntry中去。
|
||||||
|
private AnyValue conf;
|
||||||
|
|
||||||
private final ClassLoader classLoader;
|
private final ClassLoader classLoader;
|
||||||
|
|
||||||
|
|||||||
@@ -28,7 +28,8 @@ public abstract class LoggingBaseHandler extends Handler {
|
|||||||
public static final String FORMATTER_FORMAT3 =
|
public static final String FORMATTER_FORMAT3 =
|
||||||
"[%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS.%tL] [%7$s] %8$s %4$s %2$s\r\n%5$s%6$s\r\n";
|
"[%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS.%tL] [%7$s] %8$s %4$s %2$s\r\n%5$s%6$s\r\n";
|
||||||
|
|
||||||
static boolean traceEnable = false; // 防止设置system.property前调用Traces类导致enable提前初始化
|
// 防止设置system.property前调用Traces类导致enable提前初始化
|
||||||
|
static boolean traceEnable = false;
|
||||||
|
|
||||||
/** 默认的日志时间格式化类 与SimpleFormatter的区别在于level不使用本地化 */
|
/** 默认的日志时间格式化类 与SimpleFormatter的区别在于level不使用本地化 */
|
||||||
public static class LoggingFormater extends Formatter {
|
public static class LoggingFormater extends Formatter {
|
||||||
|
|||||||
@@ -73,19 +73,24 @@ public class LoggingFileHandler extends LoggingBaseHandler {
|
|||||||
|
|
||||||
protected String pattern;
|
protected String pattern;
|
||||||
|
|
||||||
protected String patternDateFormat; // 需要时间格式化
|
// 需要时间格式化
|
||||||
|
protected String patternDateFormat;
|
||||||
|
|
||||||
protected String unusual; // 不为null表示将 WARNING、SEVERE 级别的日志写入单独的文件中
|
// 不为null表示将 WARNING、SEVERE 级别的日志写入单独的文件中
|
||||||
|
protected String unusual;
|
||||||
|
|
||||||
protected String unusualDateFormat; // 需要时间格式化
|
// 需要时间格式化
|
||||||
|
protected String unusualDateFormat;
|
||||||
|
|
||||||
private int limit; // 文件大小限制
|
// 文件大小限制
|
||||||
|
private int limit;
|
||||||
|
|
||||||
private final AtomicInteger logIndex = new AtomicInteger();
|
private final AtomicInteger logIndex = new AtomicInteger();
|
||||||
|
|
||||||
private final AtomicInteger logUnusualIndex = new AtomicInteger();
|
private final AtomicInteger logUnusualIndex = new AtomicInteger();
|
||||||
|
|
||||||
private int count = 1; // 文件限制
|
// 文件限制
|
||||||
|
private int count = 1;
|
||||||
|
|
||||||
private long tomorrow;
|
private long tomorrow;
|
||||||
|
|
||||||
|
|||||||
@@ -34,9 +34,11 @@ public class LoggingSearchHandler extends LoggingBaseHandler {
|
|||||||
|
|
||||||
protected final AtomicInteger retryCount = new AtomicInteger(3);
|
protected final AtomicInteger retryCount = new AtomicInteger(3);
|
||||||
|
|
||||||
protected String tag = DEFAULT_TABLE_NAME; // 用于表前缀, 默认是
|
// 用于表前缀, 默认是
|
||||||
|
protected String tag = DEFAULT_TABLE_NAME;
|
||||||
|
|
||||||
protected String tagDateFormat; // 需要时间格式化
|
// 需要时间格式化
|
||||||
|
protected String tagDateFormat;
|
||||||
|
|
||||||
protected String pattern;
|
protected String pattern;
|
||||||
|
|
||||||
|
|||||||
@@ -34,7 +34,8 @@ import org.redkale.watch.*;
|
|||||||
@NodeProtocol("HTTP")
|
@NodeProtocol("HTTP")
|
||||||
public class NodeHttpServer extends NodeServer {
|
public class NodeHttpServer extends NodeServer {
|
||||||
|
|
||||||
protected final boolean rest; // 是否加载REST服务, 为true加载rest节点信息并将所有可REST化的Service生成RestServlet
|
// 是否加载REST服务, 为true加载rest节点信息并将所有可REST化的Service生成RestServlet
|
||||||
|
protected final boolean rest;
|
||||||
|
|
||||||
protected final HttpServer httpServer;
|
protected final HttpServer httpServer;
|
||||||
|
|
||||||
|
|||||||
@@ -22,17 +22,22 @@ import org.redkale.util.Attribute;
|
|||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public final class DeMember<R extends Reader, T, F> {
|
public final class DeMember<R extends Reader, T, F> {
|
||||||
|
|
||||||
final Field field; // 对应类成员的Field, 也可能为null
|
// 对应类成员的Field, 也可能为null
|
||||||
|
final Field field;
|
||||||
|
|
||||||
final Method method; // 对应类成员的Method也可能为null
|
// 对应类成员的Method也可能为null
|
||||||
|
final Method method;
|
||||||
|
|
||||||
final String comment;
|
final String comment;
|
||||||
|
|
||||||
protected int index; // 从1开始
|
// 从1开始
|
||||||
|
protected int index;
|
||||||
|
|
||||||
protected int position; // 从1开始
|
// 从1开始
|
||||||
|
protected int position;
|
||||||
|
|
||||||
protected int tag; // 主要给protobuf使用 从1开始
|
// 主要给protobuf使用 从1开始
|
||||||
|
protected int tag;
|
||||||
|
|
||||||
protected final Attribute<T, F> attribute;
|
protected final Attribute<T, F> attribute;
|
||||||
|
|
||||||
@@ -42,7 +47,6 @@ public final class DeMember<R extends Reader, T, F> {
|
|||||||
this.attribute = attribute;
|
this.attribute = attribute;
|
||||||
this.tag = tag;
|
this.tag = tag;
|
||||||
this.index = tag;
|
this.index = tag;
|
||||||
this.position = position;
|
|
||||||
this.decoder = decoder;
|
this.decoder = decoder;
|
||||||
this.comment = "";
|
this.comment = "";
|
||||||
this.field = null;
|
this.field = null;
|
||||||
|
|||||||
@@ -38,17 +38,23 @@ public final class EnMember<W extends Writer, T, F> {
|
|||||||
|
|
||||||
final byte[] jsonFieldNameBytes;
|
final byte[] jsonFieldNameBytes;
|
||||||
|
|
||||||
final Field field; // 对应类成员的Field也可能为null
|
// 对应类成员的Field也可能为null
|
||||||
|
final Field field;
|
||||||
|
|
||||||
final Method method; // 对应类成员的Method也可能为null
|
// 对应类成员的Method也可能为null
|
||||||
|
final Method method;
|
||||||
|
|
||||||
final BiFunction<String, Object, Object> fieldFunc; // 一般为null
|
// 一般为null
|
||||||
|
final BiFunction<String, Object, Object> fieldFunc;
|
||||||
|
|
||||||
int index; // 从1开始
|
// 从1开始
|
||||||
|
int index;
|
||||||
|
|
||||||
int position; // 从1开始
|
// 从1开始
|
||||||
|
int position;
|
||||||
|
|
||||||
int tag; // 主要给protobuf使用 从1开始
|
// 主要给protobuf使用 从1开始
|
||||||
|
int tag;
|
||||||
|
|
||||||
public EnMember(Attribute<T, F> attribute, int tag, Encodeable<W, F> encoder) {
|
public EnMember(Attribute<T, F> attribute, int tag, Encodeable<W, F> encoder) {
|
||||||
this.attribute = attribute;
|
this.attribute = attribute;
|
||||||
|
|||||||
@@ -29,7 +29,8 @@ public abstract class Reader {
|
|||||||
|
|
||||||
public static final short SIGN_NOLENGTH = -2;
|
public static final short SIGN_NOLENGTH = -2;
|
||||||
|
|
||||||
public static final short SIGN_NOLENBUTBYTES = -3; // 目前只适合于protobuf的boolean[]...double[]类型
|
// 目前只适合于protobuf的boolean[]...double[]类型
|
||||||
|
public static final short SIGN_NOLENBUTBYTES = -3;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 设置Reader的内容,通常结合对象池使用
|
* 设置Reader的内容,通常结合对象池使用
|
||||||
|
|||||||
@@ -41,9 +41,11 @@ public abstract class AsyncConnection implements Channel, AutoCloseable {
|
|||||||
|
|
||||||
protected volatile boolean writePending;
|
protected volatile boolean writePending;
|
||||||
|
|
||||||
private Map<String, Object> attributes; // 用于存储绑定在Connection上的对象集合
|
// 用于存储绑定在Connection上的对象集合
|
||||||
|
private Map<String, Object> attributes;
|
||||||
|
|
||||||
private Object subobject; // 用于存储绑定在Connection上的对象, 同attributes, 只绑定单个对象时尽量使用subobject而非attributes
|
// 用于存储绑定在Connection上的对象, 同attributes, 只绑定单个对象时尽量使用subobject而非attributes
|
||||||
|
private Object subobject;
|
||||||
|
|
||||||
protected final AsyncIOGroup ioGroup;
|
protected final AsyncIOGroup ioGroup;
|
||||||
|
|
||||||
|
|||||||
@@ -220,17 +220,17 @@ public class AsyncIOGroup extends AsyncGroup {
|
|||||||
AsyncIOThread currThread = AsyncIOThread.currentAsyncIOThread();
|
AsyncIOThread currThread = AsyncIOThread.currentAsyncIOThread();
|
||||||
if (currThread != null) {
|
if (currThread != null) {
|
||||||
if (this.ioReadThreads[0].getThreadGroup() == currThread.getThreadGroup()) {
|
if (this.ioReadThreads[0].getThreadGroup() == currThread.getThreadGroup()) {
|
||||||
for (int i = 0; i < this.ioReadThreads.length; i++) {
|
for (AsyncIOThread ioReadThread : this.ioReadThreads) {
|
||||||
if (this.ioReadThreads[i].index() == currThread.index()) {
|
if (ioReadThread.index() == currThread.index()) {
|
||||||
readThread = this.ioReadThreads[i];
|
readThread = ioReadThread;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (this.ioWriteThreads[0].getThreadGroup() == currThread.getThreadGroup()) {
|
if (this.ioWriteThreads[0].getThreadGroup() == currThread.getThreadGroup()) {
|
||||||
for (int i = 0; i < this.ioWriteThreads.length; i++) {
|
for (AsyncIOThread ioWriteThread : this.ioWriteThreads) {
|
||||||
if (this.ioWriteThreads[i].index() == currThread.index()) {
|
if (ioWriteThread.index() == currThread.index()) {
|
||||||
writeThread = this.ioWriteThreads[i];
|
writeThread = ioWriteThread;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -299,15 +299,15 @@ public class AsyncIOGroup extends AsyncGroup {
|
|||||||
AsyncIOThread writeThread = null;
|
AsyncIOThread writeThread = null;
|
||||||
AsyncIOThread currThread = AsyncIOThread.currentAsyncIOThread();
|
AsyncIOThread currThread = AsyncIOThread.currentAsyncIOThread();
|
||||||
if (currThread != null) {
|
if (currThread != null) {
|
||||||
for (int i = 0; i < this.ioReadThreads.length; i++) {
|
for (AsyncIOThread ioReadThread : this.ioReadThreads) {
|
||||||
if (this.ioReadThreads[i].index() == currThread.index()) {
|
if (ioReadThread.index() == currThread.index()) {
|
||||||
readThread = this.ioReadThreads[i];
|
readThread = ioReadThread;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (int i = 0; i < this.ioWriteThreads.length; i++) {
|
for (AsyncIOThread ioWriteThread : this.ioWriteThreads) {
|
||||||
if (this.ioWriteThreads[i].index() == currThread.index()) {
|
if (ioWriteThread.index() == currThread.index()) {
|
||||||
writeThread = this.ioWriteThreads[i];
|
writeThread = ioWriteThread;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -52,7 +52,9 @@ public abstract class Request<C extends Context> {
|
|||||||
|
|
||||||
protected AsyncConnection channel;
|
protected AsyncConnection channel;
|
||||||
|
|
||||||
/** properties 与 attributes 的区别在于:调用recycle时, attributes会被清空而properties会保留; properties 通常存放需要永久绑定在request里的一些对象 */
|
// properties与attributes的区别在于:
|
||||||
|
// 调用recycle时, attributes会被清空而properties会保留;
|
||||||
|
// properties 通常存放需要永久绑定在request里的一些对象
|
||||||
private final Map<String, Object> properties = new HashMap<>();
|
private final Map<String, Object> properties = new HashMap<>();
|
||||||
|
|
||||||
/** 每次新请求都会清空 */
|
/** 每次新请求都会清空 */
|
||||||
|
|||||||
@@ -28,9 +28,11 @@ public abstract class Response<C extends Context, R extends Request<C>> {
|
|||||||
|
|
||||||
protected final C context;
|
protected final C context;
|
||||||
|
|
||||||
protected Supplier<Response> responseSupplier; // 虚拟构建的Response可能不存在responseSupplier
|
// 虚拟构建的Response可能不存在responseSupplier
|
||||||
|
protected Supplier<Response> responseSupplier;
|
||||||
|
|
||||||
protected Consumer<Response> responseConsumer; // 虚拟构建的Response可能不存在responseConsumer
|
// 虚拟构建的Response可能不存在responseConsumer
|
||||||
|
protected Consumer<Response> responseConsumer;
|
||||||
|
|
||||||
protected final ExecutorService workExecutor;
|
protected final ExecutorService workExecutor;
|
||||||
|
|
||||||
@@ -44,7 +46,8 @@ public abstract class Response<C extends Context, R extends Request<C>> {
|
|||||||
|
|
||||||
protected boolean inNonBlocking = true;
|
protected boolean inNonBlocking = true;
|
||||||
|
|
||||||
protected Object output; // 输出的结果对象
|
// 输出的结果对象
|
||||||
|
protected Object output;
|
||||||
|
|
||||||
protected BiConsumer<R, Response<C, R>> recycleListener;
|
protected BiConsumer<R, Response<C, R>> recycleListener;
|
||||||
|
|
||||||
|
|||||||
@@ -20,9 +20,11 @@ import org.redkale.util.AnyValue;
|
|||||||
*/
|
*/
|
||||||
public abstract class Servlet<C extends Context, R extends Request<C>, P extends Response<C, R>> {
|
public abstract class Servlet<C extends Context, R extends Request<C>, P extends Response<C, R>> {
|
||||||
|
|
||||||
AnyValue _conf; // 当前Servlet的配置
|
// 当前Servlet的配置
|
||||||
|
AnyValue _conf;
|
||||||
|
|
||||||
protected boolean _nonBlocking; // 当前Servlet.execute方法是否为非阻塞模式
|
// 当前Servlet.execute方法是否为非阻塞模式
|
||||||
|
protected boolean _nonBlocking;
|
||||||
|
|
||||||
// Server执行start时运行此方法
|
// Server执行start时运行此方法
|
||||||
public void init(C context, AnyValue config) {}
|
public void init(C context, AnyValue config) {}
|
||||||
|
|||||||
@@ -22,9 +22,11 @@ public class WorkThread extends Thread implements Executor {
|
|||||||
|
|
||||||
protected final ExecutorService workExecutor;
|
protected final ExecutorService workExecutor;
|
||||||
|
|
||||||
private final int index; // WorkThread下标,从0开始
|
// WorkThread下标,从0开始
|
||||||
|
private final int index;
|
||||||
|
|
||||||
private final int threads; // WorkThread个数
|
// WorkThread个数
|
||||||
|
private final int threads;
|
||||||
|
|
||||||
public WorkThread(
|
public WorkThread(
|
||||||
ThreadGroup g, String name, int index, int threads, ExecutorService workExecutor, Runnable target) {
|
ThreadGroup g, String name, int index, int threads, ExecutorService workExecutor, Runnable target) {
|
||||||
|
|||||||
@@ -37,9 +37,11 @@ public abstract class Client<C extends ClientConnection<R, P>, R extends ClientR
|
|||||||
|
|
||||||
protected final String name;
|
protected final String name;
|
||||||
|
|
||||||
protected final AsyncGroup group; // 连接构造器
|
// 连接构造器
|
||||||
|
protected final AsyncGroup group;
|
||||||
|
|
||||||
protected final boolean tcp; // 是否TCP协议
|
// 是否TCP协议
|
||||||
|
protected final boolean tcp;
|
||||||
|
|
||||||
protected final ScheduledThreadPoolExecutor timeoutScheduler;
|
protected final ScheduledThreadPoolExecutor timeoutScheduler;
|
||||||
|
|
||||||
@@ -55,17 +57,19 @@ public abstract class Client<C extends ClientConnection<R, P>, R extends ClientR
|
|||||||
private final AtomicBoolean closed = new AtomicBoolean();
|
private final AtomicBoolean closed = new AtomicBoolean();
|
||||||
|
|
||||||
// 不可protected、public
|
// 不可protected、public
|
||||||
private final ClientAddress address; // 连接的地址
|
// 连接的地址
|
||||||
|
private final ClientAddress address;
|
||||||
|
|
||||||
// 连随机地址模式
|
// 连随机地址模式,最大连接数
|
||||||
private final int connLimit; // 最大连接数
|
private final int connLimit;
|
||||||
|
|
||||||
// 连指定地址模式
|
// 连指定地址模式
|
||||||
private final ConcurrentHashMap<SocketAddress, AddressConnEntry[]> connAddrEntrys = new ConcurrentHashMap<>();
|
private final ConcurrentHashMap<SocketAddress, AddressConnEntry[]> connAddrEntrys = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
protected ScheduledFuture timeoutFuture;
|
protected ScheduledFuture timeoutFuture;
|
||||||
|
|
||||||
protected int maxPipelines = DEFAULT_MAX_PIPELINES; // 单个连接最大并行处理数
|
// 单个连接最大并行处理数
|
||||||
|
protected int maxPipelines = DEFAULT_MAX_PIPELINES;
|
||||||
|
|
||||||
protected int connectTimeoutSeconds;
|
protected int connectTimeoutSeconds;
|
||||||
|
|
||||||
|
|||||||
@@ -83,9 +83,11 @@ public abstract class ClientConnection<R extends ClientRequest, P extends Client
|
|||||||
// pauseWriting=true,此字段才会有值; pauseWriting=false,此字段值为null
|
// pauseWriting=true,此字段才会有值; pauseWriting=false,此字段值为null
|
||||||
ClientFuture currHalfWriteFuture;
|
ClientFuture currHalfWriteFuture;
|
||||||
|
|
||||||
Iterator<ClientFuture<R, P>> currRespIterator; // 必须在调用decodeMessages之前重置为null
|
// 必须在调用decodeMessages之前重置为null
|
||||||
|
Iterator<ClientFuture<R, P>> currRespIterator;
|
||||||
|
|
||||||
private int maxPipelines; // 最大并行处理数
|
// 最大并行处理数
|
||||||
|
private int maxPipelines;
|
||||||
|
|
||||||
private boolean authenticated;
|
private boolean authenticated;
|
||||||
|
|
||||||
|
|||||||
@@ -18,8 +18,9 @@ import org.redkale.annotation.Nullable;
|
|||||||
*/
|
*/
|
||||||
public class ClientResponse<R extends ClientRequest, P extends ClientResult> {
|
public class ClientResponse<R extends ClientRequest, P extends ClientResult> {
|
||||||
|
|
||||||
|
// 服务端返回一个不存在的requestid,可能为null
|
||||||
@Nullable
|
@Nullable
|
||||||
protected R request; // 服务端返回一个不存在的requestid,可能为null
|
protected R request;
|
||||||
|
|
||||||
protected P message;
|
protected P message;
|
||||||
|
|
||||||
|
|||||||
@@ -157,7 +157,8 @@ public class HttpResponse extends Response<HttpContext, HttpRequest> {
|
|||||||
|
|
||||||
private boolean respHeadContainsConnection;
|
private boolean respHeadContainsConnection;
|
||||||
|
|
||||||
private int headWritedSize = -1; // 0表示跳过header,正数表示header的字节长度。
|
// 0表示跳过header,正数表示header的字节长度。
|
||||||
|
private int headWritedSize = -1;
|
||||||
|
|
||||||
private BiConsumer<HttpResponse, byte[]> cacheHandler;
|
private BiConsumer<HttpResponse, byte[]> cacheHandler;
|
||||||
|
|
||||||
|
|||||||
@@ -5,8 +5,6 @@
|
|||||||
*/
|
*/
|
||||||
package org.redkale.net.http;
|
package org.redkale.net.http;
|
||||||
|
|
||||||
import static org.redkale.boot.Application.RESNAME_SERVER_RESFACTORY;
|
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.lang.reflect.*;
|
import java.lang.reflect.*;
|
||||||
import java.net.InetSocketAddress;
|
import java.net.InetSocketAddress;
|
||||||
@@ -21,6 +19,7 @@ import java.util.zip.*;
|
|||||||
import org.redkale.annotation.*;
|
import org.redkale.annotation.*;
|
||||||
import org.redkale.annotation.Comment;
|
import org.redkale.annotation.Comment;
|
||||||
import org.redkale.boot.Application;
|
import org.redkale.boot.Application;
|
||||||
|
import static org.redkale.boot.Application.RESNAME_SERVER_RESFACTORY;
|
||||||
import org.redkale.convert.Convert;
|
import org.redkale.convert.Convert;
|
||||||
import org.redkale.inject.Resourcable;
|
import org.redkale.inject.Resourcable;
|
||||||
import org.redkale.inject.ResourceFactory;
|
import org.redkale.inject.ResourceFactory;
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ public class ByteBufferPool extends ObjectPool<ByteBuffer> {
|
|||||||
max,
|
max,
|
||||||
(Object... params) -> ByteBuffer.allocateDirect(bufferCapacity),
|
(Object... params) -> ByteBuffer.allocateDirect(bufferCapacity),
|
||||||
null,
|
null,
|
||||||
(e) -> {
|
e -> {
|
||||||
if (e == null || e.isReadOnly() || e.capacity() != bufferCapacity) {
|
if (e == null || e.isReadOnly() || e.capacity() != bufferCapacity) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user