This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user