This commit is contained in:
Redkale
2017-05-27 13:18:32 +08:00
parent 97670261e6
commit 54f4f8e35d
4 changed files with 26 additions and 7 deletions

View File

@@ -233,6 +233,13 @@ public final class Rest {
mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 0);
mv.visitLdcInsn(Type.getObjectType(newDynName + "$" + newDynWebSokcetSimpleName + "Message")); mv.visitLdcInsn(Type.getObjectType(newDynName + "$" + newDynWebSokcetSimpleName + "Message"));
mv.visitFieldInsn(PUTFIELD, newDynName, "messageTextType", "Ljava/lang/reflect/Type;"); 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.visitInsn(RETURN);
mv.visitMaxs(2, 1); mv.visitMaxs(2, 1);
mv.visitEnd(); mv.visitEnd();

View File

@@ -37,6 +37,13 @@ public @interface RestWebSocket {
*/ */
String catalog() default ""; String catalog() default "";
/**
* WebScoket服务器给客户端进行ping操作的间隔时间, 单位: 秒, 默认值60秒
*
* @return int
*/
int liveinterval() default 60;
/** /**
* 是否屏蔽该类的转换 * 是否屏蔽该类的转换
* *

View File

@@ -54,30 +54,33 @@ public final class WebSocketEngine {
//FINEST日志级别 //FINEST日志级别
protected final boolean 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.engineid = engineid;
this.context = context; this.context = context;
this.convert = context.getJsonConvert(); this.convert = context.getJsonConvert();
this.node = node; this.node = node;
this.liveinterval = liveinterval;
this.logger = logger; this.logger = logger;
this.index = sequence.getAndIncrement(); this.index = sequence.getAndIncrement();
this.finest = logger.isLoggable(Level.FINEST); this.finest = logger.isLoggable(Level.FINEST);
} }
void init(AnyValue conf) { void init(AnyValue conf) {
final int liveinterval = conf == null ? DEFAILT_LIVEINTERVAL : conf.getIntValue("liveinterval", DEFAILT_LIVEINTERVAL); final int interval = conf == null ? (liveinterval < 0 ? DEFAILT_LIVEINTERVAL : liveinterval) : conf.getIntValue("liveinterval", (liveinterval < 0 ? DEFAILT_LIVEINTERVAL : liveinterval));
if (liveinterval <= 0) return; if (interval <= 0) return;
if (scheduler != null) return; if (scheduler != null) return;
this.scheduler = new ScheduledThreadPoolExecutor(1, (Runnable r) -> { this.scheduler = new ScheduledThreadPoolExecutor(1, (Runnable r) -> {
final Thread t = new Thread(r, engineid + "-WebSocket-LiveInterval-Thread"); final Thread t = new Thread(r, engineid + "-WebSocket-LiveInterval-Thread");
t.setDaemon(true); t.setDaemon(true);
return t; return t;
}); });
long delay = (liveinterval - System.currentTimeMillis() / 1000 % liveinterval) + index * 5; long delay = (interval - System.currentTimeMillis() / 1000 % interval) + index * 5;
scheduler.scheduleWithFixedDelay(() -> { scheduler.scheduleWithFixedDelay(() -> {
getWebSocketGroups().stream().forEach(x -> x.sendEachPing()); getWebSocketGroups().stream().forEach(x -> x.sendEachPing());
}, delay, liveinterval, TimeUnit.SECONDS); }, delay, interval, TimeUnit.SECONDS);
if (finest) logger.finest(this.getClass().getSimpleName() + "(" + engineid + ")" + " start keeplive(delay:" + delay + ", interval:" + liveinterval + "s) scheduler executor"); if (finest) logger.finest(this.getClass().getSimpleName() + "(" + engineid + ")" + " start keeplive(delay:" + delay + ", interval:" + interval + "s) scheduler executor");
} }
void destroy(AnyValue conf) { void destroy(AnyValue conf) {

View File

@@ -62,6 +62,8 @@ public abstract class WebSocketServlet extends HttpServlet implements Resourcabl
protected Type messageTextType; //RestWebSocket时会被修改 protected Type messageTextType; //RestWebSocket时会被修改
protected int liveinterval = DEFAILT_LIVEINTERVAL;
@Resource @Resource
protected JsonConvert jsonConvert; //Rest.createRestWebSocketServlet 需要过滤掉已有的@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()); if (logger.isLoggable(Level.WARNING)) logger.warning("Not found WebSocketNode, create a default value for " + getClass().getName());
} }
//存在WebSocketServlet则此WebSocketNode必须是本地模式Service //存在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.init(conf);
this.node.localEngine.init(conf); this.node.localEngine.init(conf);
} }