diff --git a/src/org/redkale/net/http/Rest.java b/src/org/redkale/net/http/Rest.java index 2499fa745..4485ada8e 100644 --- a/src/org/redkale/net/http/Rest.java +++ b/src/org/redkale/net/http/Rest.java @@ -233,6 +233,13 @@ public final class Rest { mv.visitVarInsn(ALOAD, 0); mv.visitLdcInsn(Type.getObjectType(newDynName + "$" + newDynWebSokcetSimpleName + "Message")); mv.visitFieldInsn(PUTFIELD, newDynName, "messageTextType", "Ljava/lang/reflect/Type;"); + mv.visitVarInsn(ALOAD, 0); + if (rws.liveinterval() < 6) { + mv.visitInsn(ICONST_0 + rws.liveinterval()); + } else { + mv.visitIntInsn(BIPUSH, rws.liveinterval()); + } + mv.visitFieldInsn(PUTFIELD, newDynName, "liveinterval", "I"); mv.visitInsn(RETURN); mv.visitMaxs(2, 1); mv.visitEnd(); diff --git a/src/org/redkale/net/http/RestWebSocket.java b/src/org/redkale/net/http/RestWebSocket.java index d996fdda0..3ac3c2997 100644 --- a/src/org/redkale/net/http/RestWebSocket.java +++ b/src/org/redkale/net/http/RestWebSocket.java @@ -37,6 +37,13 @@ public @interface RestWebSocket { */ String catalog() default ""; + /** + * WebScoket服务器给客户端进行ping操作的间隔时间, 单位: 秒, 默认值:60秒 + * + * @return int + */ + int liveinterval() default 60; + /** * 是否屏蔽该类的转换 * diff --git a/src/org/redkale/net/http/WebSocketEngine.java b/src/org/redkale/net/http/WebSocketEngine.java index 8e982a3cb..3d6678a8f 100644 --- a/src/org/redkale/net/http/WebSocketEngine.java +++ b/src/org/redkale/net/http/WebSocketEngine.java @@ -54,30 +54,33 @@ public final class WebSocketEngine { //FINEST日志级别 protected final boolean finest; - protected WebSocketEngine(String engineid, HttpContext context, WebSocketNode node, Logger logger) { + private int liveinterval; + + protected WebSocketEngine(String engineid, HttpContext context, int liveinterval, WebSocketNode node, Logger logger) { this.engineid = engineid; this.context = context; this.convert = context.getJsonConvert(); this.node = node; + this.liveinterval = liveinterval; this.logger = logger; this.index = sequence.getAndIncrement(); this.finest = logger.isLoggable(Level.FINEST); } void init(AnyValue conf) { - final int liveinterval = conf == null ? DEFAILT_LIVEINTERVAL : conf.getIntValue("liveinterval", DEFAILT_LIVEINTERVAL); - if (liveinterval <= 0) return; + final int interval = conf == null ? (liveinterval < 0 ? DEFAILT_LIVEINTERVAL : liveinterval) : conf.getIntValue("liveinterval", (liveinterval < 0 ? DEFAILT_LIVEINTERVAL : liveinterval)); + if (interval <= 0) return; if (scheduler != null) return; this.scheduler = new ScheduledThreadPoolExecutor(1, (Runnable r) -> { final Thread t = new Thread(r, engineid + "-WebSocket-LiveInterval-Thread"); t.setDaemon(true); return t; }); - long delay = (liveinterval - System.currentTimeMillis() / 1000 % liveinterval) + index * 5; + long delay = (interval - System.currentTimeMillis() / 1000 % interval) + index * 5; scheduler.scheduleWithFixedDelay(() -> { getWebSocketGroups().stream().forEach(x -> x.sendEachPing()); - }, delay, liveinterval, TimeUnit.SECONDS); - if (finest) logger.finest(this.getClass().getSimpleName() + "(" + engineid + ")" + " start keeplive(delay:" + delay + ", interval:" + liveinterval + "s) scheduler executor"); + }, delay, interval, TimeUnit.SECONDS); + if (finest) logger.finest(this.getClass().getSimpleName() + "(" + engineid + ")" + " start keeplive(delay:" + delay + ", interval:" + interval + "s) scheduler executor"); } void destroy(AnyValue conf) { diff --git a/src/org/redkale/net/http/WebSocketServlet.java b/src/org/redkale/net/http/WebSocketServlet.java index ef529636e..34efa96c6 100644 --- a/src/org/redkale/net/http/WebSocketServlet.java +++ b/src/org/redkale/net/http/WebSocketServlet.java @@ -62,6 +62,8 @@ public abstract class WebSocketServlet extends HttpServlet implements Resourcabl protected Type messageTextType; //RestWebSocket时会被修改 + protected int liveinterval = DEFAILT_LIVEINTERVAL; + @Resource protected JsonConvert jsonConvert; //Rest.createRestWebSocketServlet 需要过滤掉已有的@Resource @@ -96,7 +98,7 @@ public abstract class WebSocketServlet extends HttpServlet implements Resourcabl if (logger.isLoggable(Level.WARNING)) logger.warning("Not found WebSocketNode, create a default value for " + getClass().getName()); } //存在WebSocketServlet,则此WebSocketNode必须是本地模式Service - this.node.localEngine = new WebSocketEngine("WebSocketEngine-" + addr.getHostString() + ":" + addr.getPort() + "-[" + resourceName() + "]", context, this.node, logger); + this.node.localEngine = new WebSocketEngine("WebSocketEngine-" + addr.getHostString() + ":" + addr.getPort() + "-[" + resourceName() + "]", context, liveinterval, this.node, logger); this.node.init(conf); this.node.localEngine.init(conf); }