package com.fastbee.server.config; import com.fastbee.common.constant.FastBeeConstant; import com.fastbee.common.enums.ServerType; import com.fastbee.server.Server; import com.fastbee.base.codec.Delimiter; import com.fastbee.base.codec.LengthField; import com.fastbee.base.codec.MessageDecoder; import com.fastbee.base.codec.MessageEncoder; import com.fastbee.base.core.HandlerInterceptor; import com.fastbee.base.core.HandlerMapping; import com.fastbee.base.session.SessionManager; import io.netty.util.NettyRuntime; import io.netty.util.internal.ObjectUtil; /** * 基础配置类 * @Author guanshubiao * @Date 2022/9/12 20:22 */ public class NettyConfig { public final int workerCore; /*boss线程核数*/ public final int businessCore; /*读空闲时间*/ public final int readerIdleTime; /*写空闲时间*/ public final int writerIdleTime; /*读写空闲时间*/ public final int allIdleTime; /*端口*/ public final Integer port; /*TCP/UDP数据最大长度限定*/ public final Integer maxFrameLength; /*基础编码*/ public final MessageDecoder decoder; /*基础解码*/ public final MessageEncoder encoder; public final Delimiter[] delimiters; public final LengthField lengthField; public final HandlerMapping handlerMapping; public final HandlerInterceptor handlerInterceptor; public final SessionManager sessionManager; /*基础服务端*/ public Server server; public String name; /*服务名*/ public final ServerType type; public NettyConfig(int workerGroup, int businessGroup, int readerIdleTime, int writerIdleTime, int allIdleTime, Integer port, Integer maxFrameLength, LengthField lengthField, Delimiter[] delimiters, MessageDecoder decoder, MessageEncoder encoder, HandlerMapping handlerMapping, HandlerInterceptor handlerInterceptor, SessionManager sessionManager, ServerType type, String name, Server server) { /*校验值是否正确*/ ObjectUtil.checkNotNull(port, FastBeeConstant.SERVER.PORT); ObjectUtil.checkPositive(port, FastBeeConstant.SERVER.PORT); if (ServerType.UDP == type || ServerType.TCP == type){ ObjectUtil.checkNotNull(decoder, "decoder"); ObjectUtil.checkNotNull(encoder, "encoder"); ObjectUtil.checkNotNull(handlerMapping, "handlerMapping"); ObjectUtil.checkNotNull(handlerInterceptor, "handlerInterceptor"); } if (type == ServerType.TCP){ ObjectUtil.checkNotNull(maxFrameLength, FastBeeConstant.SERVER.MAXFRAMELENGTH); ObjectUtil.checkPositive(maxFrameLength, FastBeeConstant.SERVER.MAXFRAMELENGTH); // ObjectUtil.checkNotNull(delimiters,FastBeeConstant.SERVER.DELIMITERS); } /*获取核数*/ int processors = NettyRuntime.availableProcessors(); this.workerCore = workerGroup > 0 ? workerGroup : processors + 2; this.businessCore = businessGroup > 0 ? businessGroup : Math.max(1, processors >> 1); this.readerIdleTime = readerIdleTime; this.writerIdleTime = writerIdleTime; this.allIdleTime = allIdleTime; this.port = port; this.maxFrameLength = maxFrameLength; this.lengthField = lengthField; this.delimiters = delimiters; this.decoder = decoder; this.encoder = encoder; this.handlerMapping = handlerMapping; this.handlerInterceptor = handlerInterceptor; this.sessionManager = sessionManager != null ? sessionManager : new SessionManager(); this.type = type; switch (type){ case MQTT: case WEBSOCKET: this.name = name != null ? name : ServerType.MQTT.name(); this.server = server; this.server.config = this; break; default: } } public Server build() { return server; } public static NettyConfig.Builder custom() { return new Builder(); } public static class Builder { private int workerCore; private int businessCore ; private int readerIdleTime = 240; private int writerIdleTime = 0; private int allIdleTime = 0; private Integer port; private Integer maxFrameLength; private LengthField lengthField; private Delimiter[] delimiters; private MessageDecoder decoder; private MessageEncoder encoder; private HandlerMapping handlerMapping; private HandlerInterceptor handlerInterceptor; private SessionManager sessionManager; private ServerType type; private String name; private Server server; public Builder() { } public Builder setThreadGroup(int workerCore, int businessCore) { this.workerCore = workerCore; this.businessCore = businessCore; return this; } public Builder setIdleStateTime(int readerIdleTime, int writerIdleTime, int allIdleTime) { this.readerIdleTime = readerIdleTime; this.writerIdleTime = writerIdleTime; this.allIdleTime = allIdleTime; return this; } public Builder setPort(Integer port) { this.port = port; return this; } public Builder setServer(Server server){ this.server = server; return this; } public Builder setMaxFrameLength(Integer maxFrameLength) { this.maxFrameLength = maxFrameLength; return this; } public Builder setLengthField(LengthField lengthField) { this.lengthField = lengthField; return this; } public Builder setDelimiters(byte[][] delimiters) { Delimiter[] t = new Delimiter[delimiters.length]; for (int i = 0; i < delimiters.length; i++) { t[i] = new Delimiter(delimiters[i]); } this.delimiters = t; return this; } public Builder setDelimiters(Delimiter... delimiters) { this.delimiters = delimiters; return this; } public Builder setDecoder(MessageDecoder decoder) { this.decoder = decoder; return this; } public Builder setEncoder(MessageEncoder encoder) { this.encoder = encoder; return this; } public Builder setHandlerMapping(HandlerMapping handlerMapping) { this.handlerMapping = handlerMapping; return this; } public Builder setHandlerInterceptor(HandlerInterceptor handlerInterceptor) { this.handlerInterceptor = handlerInterceptor; return this; } public Builder setSessionManager(SessionManager sessionManager) { this.sessionManager = sessionManager; return this; } public Builder setType(ServerType type){ this.type = type; return this; } public Builder setName(String name) { this.name = name; return this; } public Server build() { return new NettyConfig( this.workerCore, this.businessCore, this.readerIdleTime, this.writerIdleTime, this.allIdleTime, this.port, this.maxFrameLength, this.lengthField, this.delimiters, this.decoder, this.encoder, this.handlerMapping, this.handlerInterceptor, this.sessionManager, this.type, this.name, this.server ).build(); } } }