All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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