
com.gw.common.utils.GwServerWrapper Maven / Gradle / Ivy
package com.gw.common.utils;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CopyOnWriteArraySet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import com.app.common.cluster.ServerInfo;
import com.app.common.config.ATSROOTConfig;
import com.app.common.config.PropertiesHelper;
import com.gateway.connector.proto.Format;
import com.gateway.connector.proto.Proto;
import com.gateway.connector.tcp.server.AbstractApiProxy;
import com.gateway.connector.tcp.server.MessageWrapper;
import com.gateway.connector.tcp.server.SystemMessage;
import com.gateway.connector.tcp.server.TcpServer;
import com.gateway.connector.utils.AsyncBase;
import com.gateway.connector.utils.JsonUtils;
import com.gateway.connector.utils.LicenseUtil;
import de.schlichtherle.license.LicenseContentException;
@Configuration
@Component
public class GwServerWrapper extends AbstractApiProxy {
private Logger logger = LoggerFactory.getLogger(this.getClass());
@Value("${serverKey}")
public String serverKey;
private ServerInfo si;
private TcpServer ts = new TcpServer();
private SessionStatusProcess ssp = new SessionStatusProcess();
@Autowired
private YmTopicHandlerMapping ymTopicHandlerMapping;
private CopyOnWriteArraySet gwSessionStatuss = new CopyOnWriteArraySet<>();
public void addGWSessionStatus(IGWSessionStatus gwSessionStatus) {
gwSessionStatuss.add(gwSessionStatus);
}
public YmTopicHandlerMapping getYmTopicHandlerMapping() {
return ymTopicHandlerMapping;
}
public void setYmTopicHandlerMapping(YmTopicHandlerMapping ymTopicHandlerMapping) {
this.ymTopicHandlerMapping = ymTopicHandlerMapping;
}
public void start() {
try {
si = ConfigUtils.getServerInfo(this.serverKey);
Consts.ServerName = si.getName();
LicenseUtil.license_path=PropertiesHelper.getFullPath(PropertiesHelper.getATS_ROOT(), "/control/dc.dat");
ts.setGzip(true);
ts.start(this, si.getHost(), si.getPort());
} catch (Exception e) {
logger.error("start error,system exit.", e);
System.exit(-1);
}
}
public List publishMessage(String topic, String content) {
return notify(topic, content);
}
@Override
public MessageWrapper OnRequestReply(SystemMessage sMsg, Proto proto, String serverName, String topic,
String content) {
long begin = System.currentTimeMillis();
String sessionId = proto.getSessionId();
String usid = sessionId;
String csid = usid;
String[] sids = sessionId.split("=NOP=");// GW使用这块逻辑
if (sids != null && sids.length > 0) {
csid = sids[0];
}
logger.debug("sessionId:{}, csdi:{}", sessionId, csid);
if ("SessionStatus".equals(topic)) {
ssp.add(content);
proto.setBody(null);
} else {
if (sids != null && sids.length > 1) {
usid = sids[1];
}
logger.debug("usid:{}", usid);
ContentHandler handler = ymTopicHandlerMapping.get(topic);
if (handler != null) {
Message msg = new Message();
msg.setSignalID(usid);
Map map = new HashMap();
if (org.apache.commons.lang.StringUtils.isNotBlank(content)) {
map = handler.handle(topic, msg, content, map, false);
} else {
map = handler.snapshot(topic, msg, map, false);
}
byte[] resultValue = null;
if (map instanceof CedaResultMap) {
CedaResultMap crm = (CedaResultMap) map;
String result = "{}";
if (crm.data != null) {
result = JsonUtils.Serializer(crm.data);
}
if (crm.noPermitTopics.size() > 0) {
result = result + "=NOP=" + JsonUtils.Serializer(crm.noPermitTopics);
}
resultValue = result.getBytes();
} else {
resultValue = JsonUtils.SerializerBytes(map);
}
proto.setBody(resultValue);
} else {
proto.setBody(null);
logger.debug("{} is not exist.", topic);
}
}
proto.setFormat(Format.REPLY);
long end = System.currentTimeMillis();
long ts = end - begin;
if (ts >= 20 * 1000) {
logger.warn("OnRequestReply 耗时:{}:{}:{}", topic, content, ts);
}
return new MessageWrapper(MessageWrapper.MessageProtocol.REPLY, csid, proto);
}
public void dispose() {
ts.stop();
ssp.dispose();
executorService.shutdown();
}
public interface IGWSessionStatus {
void onSession(List userName, int status, boolean isall);
}
public class SessionStatusProcess extends AsyncBase {
@Override
protected void process(String content) {
Map, ?> hm = JsonUtils.Deserialize(content, Map.class);
@SuppressWarnings("unchecked")
List userName = (List) hm.get("userNames");
int status = Integer.parseInt(hm.get("status") + "");
boolean isall = Boolean.parseBoolean(hm.get("all") + "");
for (IGWSessionStatus igwSessionStatus : gwSessionStatuss) {
igwSessionStatus.onSession(userName, status, isall);
logger.info("onSession:{},{},{}", userName, status, isall);
}
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy