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.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();

View File

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

View File

@@ -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) {

View File

@@ -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);
}