Files
elink-online-common/src/main/java/com/eactive/eai/common/session/SessionManager.java
T

249 lines
8.6 KiB
Java

package com.eactive.eai.common.session;
import com.eactive.eai.authserver.service.BearerTokenInfo;
import com.eactive.eai.common.lifecycle.Lifecycle;
import com.eactive.eai.common.lifecycle.LifecycleException;
import com.eactive.eai.common.lifecycle.LifecycleListener;
import com.eactive.eai.common.lifecycle.LifecycleSupport;
import com.eactive.eai.common.message.EAIMessage;
import com.eactive.eai.common.property.PropManager;
import com.eactive.eai.common.server.EAIServerManager;
import com.eactive.eai.common.server.EAIServerVO;
import com.eactive.eai.common.sessioninfo.TerminalInfoVO;
import com.eactive.eai.common.util.Logger;
/**
* 1. 기능 :
* 1) websocket login session 정보
* 2) SA 응답거래 매핑 정보
* 3) Single Socket 접속정보
* 4) 복원거래에 대한 헤더정보 저장
* 정보 공유 관리하는 Manager 클래스
* 2. 처리 개요 : Cache 를 통한 기능처리
* 3. 주의사항
* 4. 오류처리
* deadlock 회피 - 2022.01.05 jun's
* 1. WebSocketSessionManager.sessionClose() : synchronized 범위변경
* 2. CustomRMICacheEventListener
* - cache 가 다른 cache에 접근할때 Thread 방식으로 변경
* - websocket 인스턴스에서만 작동하도록변경
* 인스턴스 stop시 오류
* 1. WebSocket 인증시에 HttpLogin 의 websocket instance및 어댑터 그룹 갱신
* 2. sessionManager stop 시 expireThread interrupt 후 logout 처리 및 cacheManager.shutdown
*
*
* @author :
* @version : v 1.0.0
* @see : 관련 기능을 참조
* @since :
* :
*/
public abstract class SessionManager implements Lifecycle {
static Logger logger = Logger.getLogger(Logger.LOGGER_DEFAULT);
public static final String ADAPTER_MASTER_CAHCE_NAME = "evictMasterCache";
public static final String ADAPTER_CAHCE_NAME = "adapterSession";
public static final String TOPIC_CAHCE_NAME = "topic";
public static final String TOPIC_MAXSZIE = "topicMaxSize";
public static final String CACHE_TOPIC_DURATION = "topicDurationSecs";
public static final String CACHE_WORKING_DIR= "workingDir";
public static final String STORE_CAHCE_NAME = "cacheStore";
public static final String CAHCE_STORE_MAXSIZE = "cacheStoreMaxSize";
public static final String CACHE_STORE_DURATION = "cacheStoreDurationSecs";
// public static final String CACHE_MAX_MEM_MB = "cacheMaxMemMb";
public static final String LOGIN_CAHCE_NAME = "loginSession";
public static final String HTTP_CAHCE_NAME = "httpLogin";
public static final String USERID_CAHCE_NAME = "convertUserIdSession";
public static final String WEBSOCKER_CAHCE_NAME = "webSocketTimeout";
public static final String TERMINAL_CAHCE_NAME = "terminalSession";
public static final String CAGATEWAY_TOKEN_CACHE_NAME = "CAGatewayToken";
public static final String SESSION_MANAGER_GROUPNAME = "RMIInfo";
public static final String SESSION_MANAGER_CACHETYPE = "cacheType";
public static final String SESSION_MANAGER_CACHETYPE_IGNITE = "IGNITE";
public static final String SESSION_MANAGER_CACHETYPE_EHCACHE = "EHCACHE";
public static final String SESSION_MANAGER_EXPIRE_INTERVAL = "expireInterval";
public static final String SESSION_MANAGER_MULTI_GROUP_IP = "multi_group_ip";
public static final String LOGGER_LEVEL = "loggerLevel";
public static final String SESSION_MANAGER_MULTI_GROUP_PORT = "multi_group_port";
public static final String SESSION_MANAGER_SESSION_TIMEOUT = "sessionTimeout";
public static final String SESSION_MANAGER_WEBSOCKET_TIMEOUT = "webSocketTimeout";
public static final String SESSION_MANAGER_KUBERNETES_NAMESPACE = "kubernetes_namespace";
public static final String SESSION_MANAGER_KUBERNETES_SERVICENAME = "kubernetes_servicename";
public static final String SESSION_MANAGER_KUBERNETES_MASTERURL = "kubernetes_masterurl";
public static final String SESSION_MANAGER_KUBERNETES_ACCOUNTTOKEN = "kubernetes_accounttoken";
public static final String SESSION_MANAGER_KUBERNETES_DISCOVERYPORT = "kubernetes_discoveryport";
public static final String ENABLE_MULTILOGIN_YN = "enable_multilogin_yn";
public static final String SESSION_VO_VALIDATION_FROM = "session_vo_validation_from";
private static ChannelSessionFacade channelSessionFacade;
private static SessionManager instance;
private boolean started;
public static final String MASTER_KEY = "master";
private LifecycleSupport lifecycle = new LifecycleSupport(this);
protected SessionManager() {
// nothing to do
}
public static synchronized SessionManager getInstance() {
if (instance == null) {
PropManager manager = PropManager.getInstance();
String type = manager.getProperty(SessionManager.SESSION_MANAGER_GROUPNAME,
SessionManager.SESSION_MANAGER_CACHETYPE, SESSION_MANAGER_CACHETYPE_IGNITE);
if (SESSION_MANAGER_CACHETYPE_IGNITE.equalsIgnoreCase(type)) {
instance = new SessionManagerForIgnite();
} else if (SESSION_MANAGER_CACHETYPE_EHCACHE.equalsIgnoreCase(type)) {
instance = new SessionManagerForEhcache();
} else {
instance = new SessionManagerForIgnite();
}
}
return instance;
}
public void start() throws LifecycleException {
if (started) {
throw new LifecycleException("RECEAICRT201");
}
lifecycle.fireLifecycleEvent(STARTING_EVENT, this);
int port = 0;
int remoteObjectPort = 0;
channelSessionFacade = ChannelSessionFacade.getInstance();
EAIServerManager mgr = EAIServerManager.getInstance();
EAIServerVO vo = mgr.getEAIServer(mgr.getLocalServerName());
// site의 포트 정책에 따라 변경될 수 있음.
// EAIServerVO 에 정의됨.
port = vo.getCacheLocalPort();
remoteObjectPort = vo.getCacheRemotePort();
init(port, remoteObjectPort);
started = true;
lifecycle.fireLifecycleEvent(STARTED_EVENT, this);
}
public void stop() throws LifecycleException {
if (!started) {
throw new LifecycleException("RECEAICRT203");
}
lifecycle.fireLifecycleEvent(STOPING_EVENT, this);
channelSessionFacade.onServerDown();
started = false;
lifecycle.fireLifecycleEvent(STOPPED_EVENT, this);
}
public void addLifecycleListener(LifecycleListener listener) {
lifecycle.addLifecycleListener(listener);
}
public LifecycleListener[] findLifecycleListeners() {
return lifecycle.findLifecycleListeners();
}
public void removeLifecycleListener(LifecycleListener listener) {
lifecycle.removeLifecycleListener(listener);
}
public boolean isStarted() {
return this.started;
}
protected abstract void init(int localPort, int remoteObjectPort);
// Single Socket 관련
public abstract SessionVO getConnectionInfo(String key);
public abstract SessionVO getConnectionStatus(String key);
public abstract void putConnectionInfo(String key, SessionVO value);
public abstract void removeConnectionInfo(String key);
// Topic 관련
public abstract EAIMessage getTopic(String key);
public abstract void putTopic(String key, EAIMessage value);
public abstract void removeTopic(String key);
// 비동기 거래 복원용
public abstract String getCacheStore(String key);
public abstract void putCacheStore(String key, String value, int ttlSecs);
public abstract void putCacheStore(String key, String value);
public abstract void removeCacheStore(String key);
// Login Cache
public abstract SessionVO getLogin(String key);
public abstract void putLogin(String key, SessionVO value);
public abstract void removeLogin(String key);
//CA Token Cache
public abstract BearerTokenInfo getCAToken(String key);
public abstract void putCAToken(String key, BearerTokenInfo value);
public abstract void removeCAToken(String key);
// HTTP Cache
public abstract SessionVO getHttpLogin(String key);
public abstract void putHttpLogin(String key, SessionVO value);
public abstract void removeHTTPLogin(String key);
// Terminal
public abstract TerminalVO getTerminal(String key);
public abstract void putTerminal(String key, TerminalVO value, TerminalInfoVO terminalInfoVO);
public abstract void removeTerminal(String key);
// CacheInfoVO
public abstract CacheInfoVO getLoginCache();
public abstract CacheInfoVO getHttpLoginCache();
public abstract CacheInfoVO getEvictMasterCache();
public abstract CacheInfoVO getTerminalCache();
public abstract CacheInfoVO getConvertUserIdCache();
public abstract CacheInfoVO getSocketCache();
public abstract String getMasterInstId();
// Convert terminalId to userId
public abstract String getConvertUserId(String key);
// WebSocketTimeout Cache
public abstract void putWebSocketTimeout(String key, SessionVO value);
public abstract void removeWebSocketTimeout(String key);
public abstract void closeManager();
public abstract String getCacheStatus();
}