This commit is contained in:
地平线
2015-09-10 14:19:20 +08:00
parent 14a72bf36a
commit 34760b75a7
6 changed files with 75 additions and 3 deletions

View File

@@ -15,6 +15,7 @@ import com.wentch.redkale.net.http.*;
import com.wentch.redkale.net.sncp.*;
import com.wentch.redkale.service.*;
import com.wentch.redkale.util.*;
import com.wentch.redkale.util.AnyValue.DefaultAnyValue;
import java.lang.reflect.*;
import java.net.InetSocketAddress;
import java.util.*;
@@ -113,7 +114,15 @@ public final class NodeHttpServer extends NodeServer {
mappings[i] = prefix + mappings[i];
}
}
this.httpServer.addHttpServlet(servlet, en.getProperty(), mappings);
DefaultAnyValue servletConf = (DefaultAnyValue) en.getProperty();
WebInitParam[] webparams = ws.initParams();
if (webparams.length > 0) {
if (servletConf == null) servletConf = new DefaultAnyValue();
for (WebInitParam webparam : webparams) {
servletConf.addValue(webparam.name(), webparam.value());
}
}
this.httpServer.addHttpServlet(servlet, servletConf, mappings);
if (sb != null) sb.append(threadName).append(" Loaded ").append(clazz.getName()).append(" --> ").append(Arrays.toString(mappings)).append(LINE_SEPARATOR);
}
if (sb != null && sb.length() > 0) logger.log(Level.FINE, sb.toString());

View File

@@ -0,0 +1,24 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package com.wentch.redkale.net.http;
import java.lang.annotation.*;
/**
*
* @author zhangjx
*/
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface WebInitParam {
String name();
String value();
String description() default "";
}

View File

@@ -23,4 +23,6 @@ public @interface WebServlet {
String[] value() default {};
int moduleid() default 0;
WebInitParam[] initParams() default {};
}

View File

@@ -5,9 +5,13 @@
*/
package com.wentch.redkale.net.http;
import static com.wentch.redkale.net.http.WebSocketPacket.DEFAULT_PING_PACKET;
import static com.wentch.redkale.net.http.WebSocketServlet.DEFAILT_LIVEINTERVAL;
import com.wentch.redkale.util.*;
import java.io.*;
import java.util.*;
import java.util.concurrent.*;
import java.util.logging.*;
/**
*
@@ -19,8 +23,33 @@ public final class WebSocketEngine {
private final Map<Serializable, WebSocketGroup> containers = new ConcurrentHashMap<>();
protected WebSocketEngine(String engineid) {
private ScheduledThreadPoolExecutor scheduler;
protected final Logger logger;
protected final boolean finest;
protected WebSocketEngine(String engineid, Logger logger) {
this.engineid = engineid;
this.logger = logger;
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;
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 now = System.currentTimeMillis() / 1000;
long delay = liveinterval - now / liveinterval;
scheduler.scheduleWithFixedDelay(() -> {
getWebSocketGroups().stream().forEach(x -> x.getWebSockets().forEach(y -> y.send(DEFAULT_PING_PACKET)));
}, delay, liveinterval, TimeUnit.SECONDS);
if (finest) logger.finest(this.getClass().getSimpleName() + " start keeplive(interval:" + liveinterval + "s) scheduler executor");
}
void add(WebSocket socket) {
@@ -48,6 +77,7 @@ public final class WebSocketEngine {
}
void close() {
if (scheduler != null) scheduler.shutdownNow();
}
public String getEngineid() {

View File

@@ -15,6 +15,8 @@ import java.util.*;
*/
public final class WebSocketPacket {
public static final WebSocketPacket DEFAULT_PING_PACKET = new WebSocketPacket(FrameType.PING, new byte[0]);
public static enum FrameType {
TEXT(0x01), BINARY(0x02), CLOSE(0x08), PING(0x09), PONG(0x0A);

View File

@@ -35,6 +35,10 @@ import javax.annotation.*;
*/
public abstract class WebSocketServlet extends HttpServlet implements Nameable {
public static final String WEBPARAM__LIVEINTERVAL = "liveinterval";
public static final int DEFAILT_LIVEINTERVAL = 60;
protected final Logger logger = Logger.getLogger(this.getClass().getSimpleName());
private final MessageDigest digest = getMessageDigest();
@@ -58,9 +62,10 @@ public abstract class WebSocketServlet extends HttpServlet implements Nameable {
@Override
public void init(Context context, AnyValue conf) {
InetSocketAddress addr = context.getServerAddress();
this.engine = new WebSocketEngine(addr.getHostString() + ":" + addr.getPort() + "-" + name());
this.engine = new WebSocketEngine(addr.getHostString() + ":" + addr.getPort() + "-" + name(), logger);
this.node.putWebSocketEngine(engine);
this.node.init(conf);
this.engine.init(conf);
}
@Override