Files
elink-online-common/src/main/java/com/eactive/eai/common/web/AppInitializer.java
T
2026-02-27 15:51:41 +09:00

552 lines
19 KiB
Java

package com.eactive.eai.common.web;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.InetAddress;
import java.nio.charset.Charset;
import java.rmi.RemoteException;
import java.security.Security;
import java.util.Arrays;
import javax.sql.DataSource;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.remoting.rmi.RmiServiceExporter;
import com.eactive.eai.adapter.socket2.config.SocketAdapterManager;
import com.eactive.eai.common.dao.Keys;
import com.eactive.eai.common.exception.ExceptionUtil;
import com.eactive.eai.common.lifecycle.LifecycleException;
import com.eactive.eai.common.lifecycle.LifecycleManager;
import com.eactive.eai.common.logger.async.AsyncLoggingPoolManager;
import com.eactive.eai.common.property.PropManager;
import com.eactive.eai.common.routing.rmi.RemoteProxy;
import com.eactive.eai.common.routing.rmi.RemoteProxyImpl;
import com.eactive.eai.common.server.EAIServerManager;
import com.eactive.eai.common.server.EAIServerVO;
import com.eactive.eai.common.state.ElinkStateManager;
import com.eactive.eai.common.util.Logger;
import com.eactive.eai.common.util.ServiceLocator;
import com.eactive.eai.common.util.ServiceLocatorException;
import com.eactive.eai.env.ConfigKeys;
import com.eactive.eai.env.ElinkConfig;
import com.eactive.eai.common.logger.async.AsyncHttpLoggingPoolManager;
/**
* eLink FrameWork이 초기화(Deploy)될 때 실행되어야 할 작업을 정의
*/
@SuppressWarnings("deprecation")
public class AppInitializer implements InitializingBean, DisposableBean {
RemoteProxy remoteProxy = new RemoteProxyImpl();
Class serviceInterface = RemoteProxy.class;
RmiServiceExporter rmiServiceExporter = new org.springframework.remoting.rmi.RmiServiceExporter();
@Autowired
private LifecycleManager lifecycleManager;
@Autowired
private EAIServerManager eaiServerManager;
private DataSource dataSource;
private String instName;
private String instPort;
private String tableOwner;
private String scalable;
private boolean isScalable;
private String routerUrl;
private String systemType; // eLink System Type
private String systemMode = "D"; // eLink System Mode : [P/T/D/S
private String eaiServerExtractor = "";
private String jndiName = "";
private int shutdownWaitSecs = 60;
private int shutdownWaitIntervalMs = 500;
private static final String SHUTDOWN_WAIT_SECS = "shutdown.wait.secs";
private static final String SHUTDOWN_WAIT_INTERVALMS = "shutdown.wait.intervalms";
public String getJndiName() {
return jndiName;
}
public void setJndiName(String jndiName) {
this.jndiName = jndiName;
}
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
public void setInstName(String instName) {
this.instName = instName;
}
public void setTableOwner(String tableOwner) {
this.tableOwner = tableOwner;
}
public void setScalable(String scalable) {
this.scalable = scalable;
}
public String getScalable() {
return scalable;
}
public String getSystemType() {
return systemType;
}
public void setSystemType(String systemType) {
this.systemType = systemType;
}
public void setSystemMode(String systemMode) {
this.systemMode = systemMode;
}
private String rmiPort;
private String rmiServicePort;
public String getRmiPort() {
return rmiPort;
}
public void setRmiPort(String rmiPort) {
this.rmiPort = rmiPort;
}
public String getRmiServicePort() {
return rmiServicePort;
}
public void setRmiServicePort(String rmiServicePort) {
this.rmiServicePort = rmiServicePort;
}
public String getRouterUrl() {
return routerUrl;
}
public void setRouterUrl(String routerUrl) {
this.routerUrl = routerUrl;
}
public String getInstPort() {
return instPort;
}
public void setInstPort(String instPort) {
this.instPort = instPort;
}
public String getEaiServerExtractor() {
return eaiServerExtractor;
}
public void setEaiServerExtractor(String eaiServerExtractor) {
this.eaiServerExtractor = eaiServerExtractor;
}
public int getShutdownWaitSecs() {
return shutdownWaitSecs;
}
public void setShutdownWaitSecs(int shutdownWaitSecs) {
this.shutdownWaitSecs = shutdownWaitSecs;
}
public int getShutdownWaitIntervalMs() {
return shutdownWaitIntervalMs;
}
public void setShutdownWaitIntervalMs(int shutdownWaitIntervalMs) {
this.shutdownWaitIntervalMs = shutdownWaitIntervalMs;
}
@SuppressWarnings("deprecation")
private void initRmiServer(int registryPort, int servicePort) throws RemoteException {
rmiServiceExporter.setServiceName("RemoteProxy");
rmiServiceExporter.setService(remoteProxy);
rmiServiceExporter.setServiceInterface(serviceInterface);
rmiServiceExporter.setRegistryPort(registryPort);
rmiServiceExporter.setServicePort(servicePort);
rmiServiceExporter.setAlwaysCreateRegistry(true);
rmiServiceExporter.afterPropertiesSet();
}
private void stopRmiServer() {
if(rmiServiceExporter != null) {
try {
rmiServiceExporter.destroy();
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
/**
* eLink FrameWork의 웹어플리케이션이 될 때 초기화 작업을 수행
**/
private void init() {
ElinkStateManager.getInstance().setWaitMaxMs(shutdownWaitSecs * 1000);
ElinkStateManager.getInstance().setSleepIntervalMs(shutdownWaitIntervalMs);
ElinkStateManager.getInstance().starting();
if (StringUtils.isBlank(System.getProperty(com.eactive.eai.common.server.Keys.EAI_SYSTEM_TYPE))) {
if (StringUtils.isNotBlank(systemType)) {
System.setProperty(com.eactive.eai.common.server.Keys.EAI_SYSTEM_TYPE, systemType);
}
}
if (StringUtils.isBlank(System.getProperty("scalable"))) {
if (StringUtils.isNotBlank(scalable)) {
System.setProperty("scalable", scalable);
}
}
if (StringUtils.isBlank(System.getProperty("router.url"))) {
if (StringUtils.isNotBlank(routerUrl)) {
System.setProperty("router.url", routerUrl);
}
}
if (StringUtils.isBlank(System.getProperty("eai.server.extractor"))) {
if (StringUtils.isNotBlank(eaiServerExtractor)) {
System.setProperty("eai.server.extractor", eaiServerExtractor);
}
}
this.isScalable = BooleanUtils.toBoolean(System.getProperty("scalable"));
if (this.isScalable) {
String uniqueInstName = instName;
if (StringUtils.isBlank(uniqueInstName)) {
uniqueInstName = RandomStringUtils.randomAlphabetic(20);
// }else if(uniqueInstName.length() > 20){
// int l = uniqueInstName.length();
// uniqueInstName = uniqueInstName.substring(l-14, l) + "-" + RandomStringUtils.randomAlphabetic(5);
}
System.setProperty(com.eactive.eai.common.server.Keys.SERVER_KEY, uniqueInstName);
} else {
String serverName = System.getProperty(com.eactive.eai.common.server.Keys.SERVER_KEY);
if (serverName == null) {
System.setProperty(com.eactive.eai.common.server.Keys.SERVER_KEY, instName);
}
}
String instPort = System.getProperty(com.eactive.eai.common.server.Keys.SERVER_PORT);
if (instPort == null) {
System.setProperty(com.eactive.eai.common.server.Keys.SERVER_PORT, this.instPort);
}
/**
* OpenJDK 11 이상 사용 시 -Dfile.encoding 프로퍼티로 ms949, euc-kr
* Charset.defaultCharset()의 값이 지정되지 않는 지정할 수 없는 버그가 존재한다
* 해당 버그를 Charset을 초기화 하여 우회하는 방법으로 처리한다.
*/
Field charset = null;
try {
charset = Charset.class.getDeclaredField("defaultCharset");
charset.setAccessible(true);
charset.set(null, null);
} catch (Exception e) {
e.printStackTrace();
}
String serverName = System.getProperty(com.eactive.eai.common.server.Keys.SERVER_KEY);
if (serverName == null) {
System.setProperty(com.eactive.eai.common.server.Keys.SERVER_KEY, instName);
}
String tOwner = System.getProperty(Keys.TABLE_OWNER_KEY);
if (tOwner == null) {
System.setProperty(Keys.TABLE_OWNER_KEY, tableOwner);
}
String sMode = System.getProperty(com.eactive.eai.common.server.Keys.EAI_SYSTEMMODE);
if (sMode == null) {
System.setProperty(com.eactive.eai.common.server.Keys.EAI_SYSTEMMODE, systemMode);
}
// set Spring dataSource to ServiceLoactor
try {
String datasourceName = System.getProperty(Keys.JDBC_NAME_KEY);
if(StringUtils.isEmpty(datasourceName)) {
System.setProperty(Keys.JDBC_NAME_KEY, this.jndiName);
}
ServiceLocator sl = ServiceLocator.getInstance();
sl.putDataSource(Keys.EAI_DATASOURCE, dataSource);
System.out.println("\n@@ " + Keys.EAI_DATASOURCE + " = " + dataSource);
} catch (ServiceLocatorException e1) {
System.out.println("ServiceLocator error");
}
System.out.println("\n@@ eLink Framework(JSON_TUNE) =====================================================");
System.out.println("@ eLink System Config Initializing -----------------------");
try {
if (StringUtils.isBlank(this.tableOwner)) {
System.out.println("==========================================================================");
System.out.println("# E R R O R : eLink System Configuration");
System.out.println("# Check Start Script Rule table Owner : -D"
+ com.eactive.eai.common.dao.Keys.TABLE_OWNER_KEY + "=");
System.out.println("# Check Start Script eLink System Mode : -D"
+ com.eactive.eai.common.server.Keys.EAI_SYSTEMMODE + "=");
System.out.println("# eLink System Mode : [P/T/D/S]");
System.out.println("==========================================================================");
throw new Exception(" Rule Table Owner Not Configured ");
}
if (StringUtils.isBlank(this.systemMode)) {
System.out.println("==========================================================================");
System.out.println("# E R R O R : eLink System Configuration");
System.out.println("# Check Start Script Rule table Owner : -D"
+ com.eactive.eai.common.dao.Keys.TABLE_OWNER_KEY + "=");
System.out.println("# Check Start Script eLink System Mode : -D"
+ com.eactive.eai.common.server.Keys.EAI_SYSTEMMODE + "=");
System.out.println("# eLink System Mode : [P/T/D/S]");
System.out.println("==========================================================================");
throw new Exception(" eLink System Mode Not Configured ");
}
System.out.println("==========================================================================");
System.out.println("# S U C C E S S : eLink System Configuration");
System.out.println("# Rule table Owner : " + this.tableOwner);
System.out.println("# Rule JDBC Name : " + com.eactive.eai.common.dao.Keys.EAI_DATASOURCE);
System.out.println("# eLink System Mode : " + this.systemMode);
System.out.println("# eLink System Mode : [P(Product)/T(Test)/D(Develop)/S(Staging)]");
System.out.println(
String.format("# %s : %s", ConfigKeys.USE_INTERNAL_TOPIC, ElinkConfig.isUseCacheTopic()));
System.out.println("==========================================================================");
System.out.println(
String.format("# %s : %s", SHUTDOWN_WAIT_SECS, shutdownWaitSecs) );
System.out.println(
String.format("# %s : %s", SHUTDOWN_WAIT_INTERVALMS, shutdownWaitIntervalMs) );
} catch (Exception e) {
throw new RuntimeException("eLink System Configuration Error - " + e.toString());
}
try {
PropManager.getInstance().start();
} catch (LifecycleException e) {
throw new RuntimeException(ExceptionUtil.getErrorCode(e, "RFCEAICWB001"));
}
try {
Logger.doConfigure();
} catch (Exception e) {
System.out.println("Logger.doConfigure error");
}
Logger logger = Logger.getLogger(Logger.LOGGER_DEFAULT);
/**
* 서버정보 입력
*/
if (this.isScalable) {
try {
EAIServerVO vo = new EAIServerVO();
vo.setAddress(InetAddress.getLocalHost().getHostAddress());
vo.setHostName(InetAddress.getLocalHost().getHostName());
vo.setName(System.getProperty(com.eactive.eai.common.server.Keys.SERVER_KEY));
// scalable merge
// vo.setPort(System.getProperty("tomcat.port.http"));
vo.setPort(System.getProperty("inst.Port"));
vo.setRouterUrl(System.getProperty("router.url"));
System.out.println("----------------------------");
System.out.println(vo.toString());
System.out.println("----------------------------");
//addServer 에서 존재여부 체크해서 updateg함
eaiServerManager.addServer(vo);
logger.info("Success Insert Server Info!!!!");
System.out.println("Success Insert Server Info!!!!");
} catch (Exception e) {
logger.error("Refresh Server Info Error~~", e);
System.out.println("Refresh Server Info Error~~" + e.getMessage());
}
}
// print system config to logger
logger.warn("==========================================================================");
logger.warn("# S U C C E S S : eLink System Configuration");
logger.warn("# Rule table Owner : " + this.tableOwner);
logger.warn("# System Mode : " + this.systemMode);
logger.warn("# System Mode : [P(Product)/T(Test)/D(Develop)/S(Staging)]");
logger.warn("==========================================================================");
// init RMI Server
String pRmiPort = System.getProperty("eai.rmiport");
if (pRmiPort != null) {
this.rmiPort = pRmiPort;
}
String pRmiServicePort = System.getProperty("eai.rmiserviceport");
if (pRmiServicePort != null) {
this.rmiServicePort = pRmiServicePort;
}
Arrays.stream(Security.getProviders())
.forEach(p -> System.out.println("JavaSecurityProviders=" + p.getName()));
try {
logger.warn("\n@@ eLink RMI Register Port : " + rmiPort + ", Service Port : " + rmiServicePort);
initRmiServer(Integer.parseInt(rmiPort), Integer.parseInt(rmiServicePort));
} catch (NumberFormatException e2) {
logger.error("eLink System RMI Server Configuration Error check port", e2);
throw new RuntimeException("eLink System RMI Server Configuration Error check port - " + e2.toString());
} catch (RemoteException e2) {
logger.error("eLink System RMI Server Start Error ", e2);
throw new RuntimeException("eLink System RMI Server Start Error - " + e2.toString());
}
// MonitoringContextFactory 기동
try {
Class clazz = Class.forName("com.eactive.eai.rms.client.context.MonitoringContextFactory");
Object factory = clazz.newInstance();
Method method = clazz.getMethod("create");
method.invoke(factory);
logger.warn("EMSCLIENT AGENT STARTED");
} catch (InvocationTargetException e) {
logger.error("EMSCLIENT AGENT CANNOT START - " + e.getTargetException().toString(), e.getTargetException());
e.getTargetException().printStackTrace();
} catch (Throwable e) {
logger.error("EMSCLIENT AGENT CANNOT START - " + e.toString(), e);
}
logger.warn("@ eLink Application Initializing -------------------------");
logger.warn(ElinkConfig.getConfigLog());
if (ElinkConfig.isUseAsyncLogging()) {
try {
logger.warn("START AsyncLoggingPoolManager");
AsyncLoggingPoolManager.getInstance().start();
logger.warn("SUCCESS AsyncLoggingPoolManager");
} catch (LifecycleException e) {
logger.error("START AsyncLoggingPoolManager failed.", e);
}
try {
logger.warn("START AsyncHttpLoggingPoolManager");
AsyncHttpLoggingPoolManager.getInstance().start();
logger.warn("SUCCESS AsyncHttpLoggingPoolManager");
} catch (LifecycleException e) {
logger.error("START AsyncHttpLoggingPoolManager failed.", e);
}
}
try {
lifecycleManager.start();
} catch (LifecycleException e) {
throw new RuntimeException(ExceptionUtil.getErrorCode(e, "RECEAICWB002"));
}
ElinkStateManager.getInstance().started();
}
/**
* eLink FrameWork의 웹어플리케이션이 Undeploy될 때 초기화된 Manager들을 중지시킴
**/
public void destroy() {
Logger logger = Logger.getLogger(Logger.LOGGER_DEFAULT);
if (logger.isWarn())
logger.warn("@ eLink Application Check current transactions.");
// Check current transaction & wait specific seconds until finish
ElinkStateManager.getInstance().stop();
if (logger.isWarn())
logger.warn("@ eLink Application destroying.");
logger.warn("stopRmiServer");
stopRmiServer();
// MonitoringContextFactory 중지
try {
Class clazz = Class.forName("com.eactive.eai.rms.client.context.MonitoringContextFactory");
Object factory = clazz.newInstance();
Method method = clazz.getMethod("stop");
method.invoke(factory);
logger.warn("EMSCLIENT AGENT STOPPED");
} catch (InvocationTargetException e) {
logger.error("EMSCLIENT AGENT CANNOT STOP - " + e.getTargetException().toString(), e.getTargetException());
e.getTargetException().printStackTrace();
} catch (Throwable e) {
logger.error("EMSCLIENT AGENT CANNOT STOP - " + e.toString(), e);
}
/**
* 서버정보 삭제
*/
if (this.isScalable) {
String instanceName = System.getProperty(com.eactive.eai.common.server.Keys.SERVER_KEY);
logger.info("Starting, Delete Server Info: " + instanceName);
System.out.println("Starting, Delete Server Info: " + instanceName);
if (StringUtils.isNotBlank(instanceName)) {
try {
eaiServerManager.removeServer(instanceName);
logger.info("Success Delete Server Info: " + instanceName);
System.out.println("Success Delete Server Info: " + instanceName);
} catch (Exception e) {
logger.error("Delete Server Info Error~~", e);
System.out.println("Delete Server Info Error~~" + instanceName + e.getMessage());
}
}
}
try {
lifecycleManager.stop();
} catch (LifecycleException e) {
throw new RuntimeException(ExceptionUtil.getErrorCode(e, "RECEAICWB002"));
}
try {
PropManager.getInstance().stop();
} catch (LifecycleException e) {
throw new RuntimeException(ExceptionUtil.getErrorCode(e, "RECEAICWB004"));
}
try {
SocketAdapterManager.getInstance().stop();
} catch (Exception e) {
throw new RuntimeException(ExceptionUtil.getErrorCode(e, "RECEAICWB005"));
}
if (ElinkConfig.isUseAsyncLogging()) {
try {
logger.warn("STOP AsyncLoggingPoolManager");
AsyncLoggingPoolManager.getInstance().stop();
logger.warn("STOPPED AsyncLoggingPoolManager");
} catch (LifecycleException e) {
logger.error("STOP AsyncLoggingPoolManager failed.", e);
}
}
logger.warn("STOP Logger");
Logger.stop();
System.out.println("\n\n");
}
@Override
public void afterPropertiesSet() throws Exception {
init();
}
}