Files
redkale/src/org/redkale/service/WebSocketNodeService.java
Redkale da53bd7db9
2017-03-23 11:20:43 +08:00

83 lines
3.3 KiB
Java

/*
* 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 org.redkale.service;
import static org.redkale.net.http.WebSocket.*;
import java.io.*;
import java.net.*;
import java.util.*;
import org.redkale.net.http.*;
import org.redkale.util.*;
/**
*
* <p>
* 详情见: https://redkale.org
*
* @author zhangjx
*/
@AutoLoad(false)
@ResourceType({WebSocketNodeService.class, WebSocketNode.class})
public class WebSocketNodeService extends WebSocketNode implements Service {
@Override
public void init(AnyValue conf) {
super.init(conf);
}
@Override
public void destroy(AnyValue conf) {
super.destroy(conf);
}
@Override
public List<String> getOnlineRemoteAddresses(@RpcTargetAddress InetSocketAddress targetAddress, Serializable groupid) {
if (localSncpAddress == null || !localSncpAddress.equals(targetAddress)) return remoteOnlineRemoteAddresses(targetAddress, groupid);
final Set<String> engineids = localNodes.get(groupid);
if (engineids == null || engineids.isEmpty()) return null;
final List<String> rs = new ArrayList<>();
for (String engineid : engineids) {
final WebSocketEngine engine = engines.get(engineid);
if (engine == null) continue;
final WebSocketGroup group = engine.getWebSocketGroup(groupid);
group.getWebSockets().forEach(x -> rs.add("ws" + Objects.hashCode(x) + '@' + x.getRemoteAddr()));
}
return rs;
}
@Override
public int sendMessage(@RpcTargetAddress InetSocketAddress addr, Serializable groupid, boolean recent, Serializable message, boolean last) {
final Set<String> engineids = localNodes.get(groupid);
if (engineids == null || engineids.isEmpty()) return RETCODE_GROUP_EMPTY;
int code = RETCODE_GROUP_EMPTY;
for (String engineid : engineids) {
final WebSocketEngine engine = engines.get(engineid);
if (engine != null) { //在本地
final WebSocketGroup group = engine.getWebSocketGroup(groupid);
if (group == null || group.isEmpty()) {
if (finest) logger.finest("receive websocket message {engineid:'" + engineid + "', groupid:" + groupid + ", content:'" + message + "'} from " + addr + " but send result is " + RETCODE_GROUP_EMPTY);
return RETCODE_GROUP_EMPTY;
}
code = group.send(recent, message, last);
if (finest) logger.finest("websocket node send message (" + message + ") from " + addr + " result is " + code);
}
}
return code;
}
@Override
public void connect(Serializable groupid, InetSocketAddress addr) {
sncpNodes.appendSetItem(groupid, addr);
if (finest) logger.finest(WebSocketNodeService.class.getSimpleName() + ".event: " + groupid + " connect from " + addr);
}
@Override
public void disconnect(Serializable groupid, InetSocketAddress addr) {
sncpNodes.removeSetItem(groupid, addr);
if (finest) logger.finest(WebSocketNodeService.class.getSimpleName() + ".event: " + groupid + " disconnect from " + addr);
}
}