This commit is contained in:
Redkale
2017-05-29 17:22:12 +08:00
parent 2291beb5e7
commit f6c617574c
9 changed files with 174 additions and 150 deletions

View File

@@ -189,6 +189,18 @@ public abstract class WebSocket<G extends Serializable, T> {
}
//----------------------------------------------------------------
/**
* 给指定userid的WebSocket节点发送 二进制消息/文本消息/JavaBean对象消息
*
* @param message 不可为空
* @param userids Serializable[]
*
* @return 为0表示成功 其他值表示异常
*/
public final CompletableFuture<Integer> sendMessage(Object message, G... userids) {
return sendMessage(message, true, userids);
}
/**
* 给指定userid的WebSocket节点发送 二进制消息/文本消息/JavaBean对象消息
*
@@ -345,10 +357,10 @@ public abstract class WebSocket<G extends Serializable, T> {
*
* @return WebSocket集合
*/
protected final Stream<WebSocket> getWebSockets(G userid) {
return _engine.getWebSockets(userid);
protected final Stream<WebSocket> getLocalWebSockets(G userid) {
return _engine.getLocalWebSockets(userid);
}
/**
* 获取指定userid的WebSocket数组, 没有返回null<br>
* 此方法用于单用户单连接模式
@@ -357,17 +369,17 @@ public abstract class WebSocket<G extends Serializable, T> {
*
* @return WebSocket
*/
protected final WebSocket findWebSocket(G userid) {
return _engine.findWebSocket(userid);
protected final WebSocket findLocalWebSocket(G userid) {
return _engine.findLocalWebSocket(userid);
}
/**
* 获取当前进程节点所有在线的WebSocket
*
* @return WebSocketGroup列表
*/
protected final Collection<WebSocket> getWebSockets() {
return _engine.getWebSockets();
protected final Collection<WebSocket> getLocalWebSockets() {
return _engine.getLocalWebSockets();
}
//-------------------------------------------------------------------

View File

@@ -85,7 +85,7 @@ public final class WebSocketEngine {
});
long delay = (interval - System.currentTimeMillis() / 1000 % interval) + index * 5;
scheduler.scheduleWithFixedDelay(() -> {
getWebSockets().forEach(x -> x.sendPing());
getLocalWebSockets().forEach(x -> x.sendPing());
}, delay, interval, TimeUnit.SECONDS);
if (finest) logger.finest(this.getClass().getSimpleName() + "(" + engineid + ")" + " start keeplive(delay:" + delay + ", interval:" + interval + "s) scheduler executor");
}
@@ -215,7 +215,7 @@ public final class WebSocketEngine {
}
}
Collection<WebSocket> getWebSockets() {
Collection<WebSocket> getLocalWebSockets() {
if (single) return websockets.values();
List<WebSocket> list = new ArrayList<>();
websockets2.values().forEach(x -> list.addAll(x));
@@ -223,14 +223,14 @@ public final class WebSocketEngine {
}
//适用于单用户单连接模式
public WebSocket findWebSocket(Serializable userid) {
public WebSocket findLocalWebSocket(Serializable userid) {
if (single) return websockets.get(userid);
List<WebSocket> list = websockets2.get(userid);
return (list == null || list.isEmpty()) ? null : list.get(list.size() - 1);
}
//适用于单用户多连接模式
public Stream<WebSocket> getWebSockets(Serializable userid) {
public Stream<WebSocket> getLocalWebSockets(Serializable userid) {
if (single) {
WebSocket websocket = websockets.get(userid);
return websocket == null ? Stream.empty() : Stream.of(websocket);
@@ -240,7 +240,7 @@ public final class WebSocketEngine {
}
}
public boolean existsWebSocket(Serializable userid) {
public boolean existsLocalWebSocket(Serializable userid) {
return single ? websockets.containsKey(userid) : websockets2.containsKey(userid);
}

View File

@@ -56,7 +56,7 @@ public abstract class WebSocketNode {
public final void postDestroy(AnyValue conf) {
if (this.localEngine == null) return;
//关掉所有本地本地WebSocket
this.localEngine.getWebSockets().forEach(g -> disconnect(g.userid()));
this.localEngine.getLocalWebSockets().forEach(g -> disconnect(g.userid()));
if (sncpNodeAddresses != null && localSncpAddress != null) sncpNodeAddresses.removeSetItem("redkale_sncpnodes", localSncpAddress);
}

View File

@@ -208,7 +208,6 @@ class WebSocketRunner implements Runnable {
boolean debug = true;
//System.out.println("推送消息");
if (debug) context.getLogger().log(Level.FINEST, "send web socket message: " + packet);
this.lastSendTime = System.currentTimeMillis();
final CompletableFuture<Integer> futureResult = new CompletableFuture<>();
if (writing.getAndSet(true)) {
queue.add(new QueueEntry(futureResult, packet));
@@ -216,6 +215,7 @@ class WebSocketRunner implements Runnable {
}
ByteBuffer[] buffers = packet.sendBuffers != null ? packet.duplicateSendBuffers() : packet.encode(this.context.getBufferSupplier());
try {
this.lastSendTime = System.currentTimeMillis();
channel.write(buffers, buffers, new CompletionHandler<Integer, ByteBuffer[]>() {
private CompletableFuture<Integer> future = futureResult;
@@ -259,6 +259,7 @@ class WebSocketRunner implements Runnable {
if (entry != null) {
future = entry.future;
ByteBuffer[] buffers = packet.sendBuffers != null ? packet.duplicateSendBuffers() : packet.encode(context.getBufferSupplier());
lastSendTime = System.currentTimeMillis();
channel.write(buffers, buffers, this);
}
} catch (Exception e) {

View File

@@ -40,7 +40,7 @@ public class WebSocketNodeService extends WebSocketNode implements Service {
if (this.localEngine == null) return CompletableFuture.completedFuture(new ArrayList<>());
return CompletableFuture.supplyAsync(() -> {
final List<String> rs = new ArrayList<>();
this.localEngine.getWebSockets(groupid).forEach(x -> rs.add(x.getRemoteAddr()));
this.localEngine.getLocalWebSockets(groupid).forEach(x -> rs.add(x.getRemoteAddr()));
return rs;
});
}