390 lines
14 KiB
Java
390 lines
14 KiB
Java
package com.eactive.eai.flowcontroller;
|
|
|
|
import com.eactive.eai.adapter.AdapterGroupVO;
|
|
import com.eactive.eai.adapter.AdapterManager;
|
|
import com.eactive.eai.adapter.AdapterPropManager;
|
|
import com.eactive.eai.adapter.AdapterVO;
|
|
import com.eactive.eai.common.EAIKeys;
|
|
import com.eactive.eai.common.EAITable;
|
|
import com.eactive.eai.common.exception.ExceptionHandler;
|
|
import com.eactive.eai.common.exception.ExceptionUtil;
|
|
import com.eactive.eai.common.message.EAIMessage;
|
|
import com.eactive.eai.common.message.EAIMessageKeys;
|
|
import com.eactive.eai.common.routing.IFRouter;
|
|
import com.eactive.eai.common.routing.Process;
|
|
import com.eactive.eai.common.util.Logger;
|
|
import com.eactive.eai.common.util.MessageUtil;
|
|
import com.eactive.eai.control.LogSender;
|
|
import com.eactive.eai.message.StandardMessage;
|
|
import com.eactive.eai.message.service.InterfaceMapper;
|
|
import com.eactive.eai.transformer.function.util.CodeConversion;
|
|
import com.ext.eai.common.stdmessage.STDMessageKeys;
|
|
|
|
public class StartFCProcess extends Process {
|
|
public String adptrMsgPtrnCd; // migration - boolean 값이 아니라 [S, N, C] 값을 가짐
|
|
|
|
public java.lang.String adapterGroupName;
|
|
|
|
public int logPssSeq;
|
|
|
|
static Logger logger = Logger.getLogger(Logger.LOGGER_DEFAULT);
|
|
|
|
public java.util.Properties callProp;
|
|
|
|
public EAIMessage resEaiMsg;
|
|
|
|
public com.eactive.eai.common.message.EAIMessage reqEaiMsg;
|
|
|
|
static Logger esbLogger = Logger.getLogger(Logger.LOGGER_ESBFW);
|
|
private int svrLogLevel;
|
|
private static ThreadLocal local = new ThreadLocal();
|
|
|
|
static final long serialVersionUID = 1L;
|
|
|
|
String guidLogPrefix = "";
|
|
|
|
public EAIMessage clientReturn() {
|
|
if (svrLogLevel >= 1) {
|
|
try {
|
|
long msgSndTm = System.currentTimeMillis();
|
|
|
|
Long threadData = (Long) local.get();
|
|
long processTm = msgSndTm - threadData.longValue();
|
|
if (esbLogger.isInfo())
|
|
esbLogger.info(
|
|
guidLogPrefix + " End... - 경과시간 : " + processTm + "(ms) - EAI Server Log Level is INFO");
|
|
} catch (Exception e) {
|
|
logger.error("clientReturn", e);
|
|
}
|
|
}
|
|
return resEaiMsg;
|
|
}
|
|
|
|
public void callService(com.eactive.eai.common.message.EAIMessage reqEaiMsg, java.util.Properties callProp) {
|
|
this.reqEaiMsg = reqEaiMsg;
|
|
this.callProp = callProp;
|
|
|
|
if (this.reqEaiMsg == null)
|
|
return;
|
|
|
|
svrLogLevel = this.reqEaiMsg.getSvrLogLvl();
|
|
|
|
// guidLogPrefix = guidLogPrefix + "GUID["+reqEaiMsg.getKbMsg().getKBHeader().getGuIdNo()+"]";
|
|
guidLogPrefix = guidLogPrefix + "GUID[" + getGuid(reqEaiMsg) + "]";
|
|
|
|
if (svrLogLevel >= 1) {
|
|
try {
|
|
long msgRcvTm = System.currentTimeMillis();
|
|
local.set(new Long(msgRcvTm));
|
|
|
|
if (esbLogger.isInfo())
|
|
esbLogger.info(guidLogPrefix + " started... - EAI Server Log Level is INFO");
|
|
} catch (Exception e) {
|
|
logger.error("callService error", e);
|
|
}
|
|
}
|
|
|
|
try {
|
|
flow();
|
|
} catch (Exception e) {
|
|
// 에러처리
|
|
printExceptionMessage(e);
|
|
// ASYNC
|
|
if (isSourceAsync()) {
|
|
// Async-로그
|
|
logSenderCtrlSend();
|
|
// ExcetpionHandler 호출
|
|
callExceptionHandler();
|
|
}
|
|
return;
|
|
|
|
}
|
|
}
|
|
|
|
public void flow() throws Exception {
|
|
// isRealCall
|
|
if (!isRealCall()) {
|
|
return;
|
|
}
|
|
// 초기화
|
|
init();
|
|
// Start Target Adapter
|
|
startTargetAdapter();
|
|
// Outbound 프로세스 호출
|
|
ifRouterProcess();
|
|
// GUID설정
|
|
setGUID();
|
|
// ASYNC-SYNC모델
|
|
if (checkServiceMsgSize()) {
|
|
// ServiceMessage설정
|
|
setCurrentService();
|
|
// 응답메시지전송
|
|
ifRouterProcessResponse();
|
|
}
|
|
}
|
|
|
|
public void ifRouterProcess() throws Exception {
|
|
try {
|
|
this.resEaiMsg = IFRouter.process(this.reqEaiMsg, this.callProp);
|
|
} catch (Exception e) {
|
|
String[] msgArgs = new String[1];
|
|
msgArgs[0] = this.reqEaiMsg.getEAISvcCd();
|
|
String rspErrorCode = "RECEAIFBF001";
|
|
String rspErrorMsg = ExceptionUtil.make(e, rspErrorCode, msgArgs);
|
|
if (logger.isError())
|
|
logger.error(guidLogPrefix + "" + rspErrorMsg);
|
|
// this.resEaiMsg.setRspErrCd(rspErrorCode);
|
|
// this.resEaiMsg.setRspErrMsg(rspErrorMsg);
|
|
this.resEaiMsg.setRspErr(rspErrorCode,rspErrorMsg);
|
|
throw new Exception(rspErrorCode);
|
|
}
|
|
|
|
// ----------------------------------------------------
|
|
// 기동시스템이 Async 거래의 OUtbound에서 오류가 발생할 경우
|
|
// ExceptionHandler를 통해 응답메시지를 전송한다.
|
|
// ----------------------------------------------------
|
|
if (EAIMessageKeys.ASYNC_SVC.equals(this.reqEaiMsg.getSvcTsmtUsgTp())) {
|
|
if (!MessageUtil.checkRspErrCd(this.resEaiMsg.getRspErrCd())) {
|
|
try {
|
|
// AdapterManager adapterManager = AdapterManager.getInstance();
|
|
// AdapterGroupVO inAdptGrpVO = adapterManager.getAdapterGroupVO(this.reqEaiMsg.getSngSysItfTp());
|
|
// String inAdapterMsgType = inAdptGrpVO.getMessageType();
|
|
//// Object[] bizObjs = this.reqEaiMsg.getBizMsg();
|
|
// Object[] bizObjs = this.reqEaiMsg.getExtMsg().getBizData();
|
|
// if(EAITable.EBCDIC_TYPE.equals(inAdapterMsgType)) {
|
|
// if(bizObjs != null && bizObjs[0] instanceof byte[]) {
|
|
// bizObjs[0] = CodeConversion.meToMixedAsc((byte[])bizObjs[0]);
|
|
// }
|
|
// }
|
|
//// this.resEaiMsg.setBizMsg(bizObjs);
|
|
// this.resEaiMsg.getExtMsg().setBizData(bizObjs);
|
|
|
|
String bizData = this.reqEaiMsg.getStandardMessage().getBizData();
|
|
String inboundCharset = callProp.getProperty(com.eactive.eai.adapter.Keys.CHARSET_KEY_IN);
|
|
this.resEaiMsg.getStandardMessage().setBizData(bizData, inboundCharset);
|
|
ExceptionHandler.handle(this.resEaiMsg);
|
|
// ----------------------------------------------------------
|
|
|
|
} catch (Exception e) {
|
|
if (logger.isError())
|
|
logger.error(guidLogPrefix + "ExceptionHandler Call Error :" + e.getMessage());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public void ifRouterProcessResponse() throws Exception {
|
|
try {
|
|
this.resEaiMsg = IFRouter.process(this.resEaiMsg, this.callProp);
|
|
} catch (Exception e) {
|
|
String[] msgArgs = new String[1];
|
|
msgArgs[0] = this.reqEaiMsg.getEAISvcCd();
|
|
String rspErrorCode = "RECEAIFBF100";
|
|
String orgErrorCode = ExceptionUtil.getErrorCode(e, rspErrorCode);
|
|
String rspErrorMsg = ExceptionUtil.make(rspErrorCode, orgErrorCode, msgArgs);
|
|
if (logger.isError())
|
|
logger.error(guidLogPrefix + "" + rspErrorMsg);
|
|
// this.resEaiMsg.setRspErrCd(rspErrorCode);
|
|
// this.resEaiMsg.setRspErrMsg(rspErrorMsg);
|
|
this.resEaiMsg.setRspErr(rspErrorCode,rspErrorMsg);
|
|
// throw new RuntimeException(rspErrorCode);
|
|
}
|
|
}
|
|
|
|
public void logSenderCtrlSend() {
|
|
String returnType = getReturnType(reqEaiMsg);
|
|
if (STDMessageKeys.SEND_RECV_CD_RECV.equals(returnType)) {
|
|
this.logPssSeq = 400;
|
|
} else {
|
|
this.logPssSeq = 200;
|
|
}
|
|
|
|
try {
|
|
LogSender.send(this.logPssSeq, this.resEaiMsg, null);
|
|
} catch (Exception e) {
|
|
if (logger.isError())
|
|
logger.error(guidLogPrefix + "AA Exception Logging Error :" + e.getMessage());
|
|
}
|
|
}
|
|
|
|
public boolean checkServiceMsgSize() {
|
|
// Outbound Error일 경우
|
|
if (MessageUtil.checkRspErrCd(this.resEaiMsg.getRspErrCd()) && reqEaiMsg.getSvcMsgs().size() > 1) {
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public void setCurrentService() throws Exception {
|
|
if (logger.isDebug())
|
|
logger.debug(guidLogPrefix + "ASYNC-SYNC CALLED");
|
|
// ---------------------------------------------------------------
|
|
// AS의 경우 다음 서비스메시지(AS 응답)에 키관리메시지내용을 복사한다.
|
|
// ---------------------------------------------------------------
|
|
String keyMgtMsgVl = resEaiMsg.getCurrentSvcMsg().getKeyMgtMsgVl();
|
|
if (logger.isDebug())
|
|
logger.debug(guidLogPrefix + "AS 응답 keyMgtMsgVl[" + keyMgtMsgVl + "]");
|
|
resEaiMsg.setSvcPssSeq(resEaiMsg.getSvcPssSeq() + 1);
|
|
resEaiMsg.getCurrentSvcMsg().setKeyMgtMsgVl(keyMgtMsgVl);
|
|
// ---------------------------------------------------------------
|
|
|
|
AdapterManager adapterManager = AdapterManager.getInstance();
|
|
AdapterGroupVO adptGrpVO = adapterManager.getAdapterGroupVO(this.adapterGroupName);
|
|
this.adptrMsgPtrnCd = adptGrpVO.getAdptrMsgPtrnCd(); // migration - boolean 값이 아니라 [S, N, C] 값을 가짐
|
|
|
|
// SA Type의 요청 Outbound가 비표준일 경우
|
|
// KESA Header의 값을 바꾼다. (0200 -> TR_RES)
|
|
|
|
}
|
|
|
|
public boolean isOutboundCall() {
|
|
return true;
|
|
}
|
|
|
|
public void init() throws Exception {
|
|
InterfaceMapper mapper = this.reqEaiMsg.getMapper();
|
|
StandardMessage standardMessage = this.reqEaiMsg.getStandardMessage();
|
|
String guid = mapper.getGuid(standardMessage);
|
|
String guidseq = mapper.getGuidSeq(standardMessage);
|
|
|
|
if (logger.isDebug())
|
|
logger.debug(guidLogPrefix + " REQ Current GUID [" + guid + "][" + guidseq + "]");
|
|
mapper.nextGuidSeq(standardMessage);
|
|
guidseq = mapper.getGuidSeq(standardMessage);
|
|
if (logger.isDebug())
|
|
logger.debug(guidLogPrefix + " REQ ADD PATHSEQ GUID [" + guid + "][" + guidseq + "]");
|
|
|
|
this.resEaiMsg = this.reqEaiMsg;
|
|
this.adapterGroupName = reqEaiMsg.getCurrentSvcMsg().getPsvSysItfTp();
|
|
}
|
|
|
|
public void printExceptionMessage(Exception e) {
|
|
// Exception e = this.context.getExceptionInfo().getException();
|
|
if (logger.isError())
|
|
logger.error(guidLogPrefix + "ExceptionPath : " + e.getMessage());
|
|
}
|
|
|
|
public boolean isSourceAsync() {
|
|
if (EAIMessageKeys.ASYNC_SVC.equals(this.reqEaiMsg.getSvcTsmtUsgTp())) {
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public void callExceptionHandler() {
|
|
try {
|
|
AdapterManager adapterManager = AdapterManager.getInstance();
|
|
AdapterGroupVO inAdptGrpVO = adapterManager.getAdapterGroupVO(this.reqEaiMsg.getSngSysItfTp());
|
|
String inAdapterMsgType = inAdptGrpVO.getMessageType();
|
|
if (EAITable.EBCDIC_TYPE.equals(inAdapterMsgType)) {
|
|
//// Object[] bizObjs = this.reqEaiMsg.getBizMsg();
|
|
// Object[] bizObjs = this.reqEaiMsg.getExtMsg().getBizData();
|
|
// if(bizObjs != null && bizObjs[0] instanceof byte[]) {
|
|
// bizObjs[0] = CodeConversion.meToMixedAsc((byte[])bizObjs[0]);
|
|
// }
|
|
//// this.reqEaiMsg.setBizMsg(bizObjs);
|
|
// this.reqEaiMsg.getExtMsg().setBizData(bizObjs);
|
|
String bizData = this.reqEaiMsg.getStandardMessage().getBizData();
|
|
byte[] asc = CodeConversion.meToMixedAsc(bizData.getBytes());
|
|
try {
|
|
String inboundCharset = callProp.getProperty(com.eactive.eai.adapter.Keys.CHARSET_KEY_IN);
|
|
this.reqEaiMsg.getStandardMessage().setBizData(new String(asc), inboundCharset);
|
|
} catch (Exception e) {
|
|
logger.error("setBizData error", e);
|
|
}
|
|
}
|
|
// ----------------------------------------------------------
|
|
ExceptionHandler.handle(this.reqEaiMsg);
|
|
} catch (Exception e) {
|
|
if (logger.isError())
|
|
logger.error(guidLogPrefix + "ExceptionHandler Call Error :" + e.getMessage());
|
|
}
|
|
}
|
|
|
|
public boolean isRealCall() {
|
|
if (this.callProp != null) {
|
|
String mode = this.callProp.getProperty(EAIKeys.CALL_MODE_KEY);
|
|
if (mode != null && EAIKeys.CALL_MODE_WARMUP.equals(mode)) {
|
|
logger.warn(guidLogPrefix + "Warming Up Called");
|
|
return false;
|
|
} else {
|
|
return true;
|
|
}
|
|
} else {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
public void setGUID() throws Exception {
|
|
InterfaceMapper mapper = this.resEaiMsg.getMapper();
|
|
StandardMessage standardMessage = this.resEaiMsg.getStandardMessage();
|
|
String guid = mapper.getGuid(standardMessage);
|
|
String guidseq = mapper.getGuidSeq(standardMessage);
|
|
|
|
if (logger.isDebug())
|
|
logger.debug(guidLogPrefix + " REQ Current GUID [" + guid + "][" + guidseq + "]");
|
|
mapper.nextGuidSeq(standardMessage);
|
|
guidseq = mapper.getGuidSeq(standardMessage);
|
|
if (logger.isDebug())
|
|
logger.debug(guidLogPrefix + " REQ ADD PATHSEQ GUID [" + guid + "][" + guidseq + "]");
|
|
|
|
}
|
|
|
|
public void startTargetAdapter() throws Exception {
|
|
try {
|
|
String srcAdapterGroupName = this.reqEaiMsg.getSngSysItfTp();
|
|
|
|
AdapterManager adapterManager = AdapterManager.getInstance();
|
|
AdapterGroupVO srcAdapterGroup = adapterManager.getAdapterGroupVO(srcAdapterGroupName);
|
|
|
|
String[] srcAdapterNames = srcAdapterGroup.getAdapterNames();
|
|
|
|
if (srcAdapterNames != null && srcAdapterNames.length > 0) {
|
|
AdapterVO srcAdapter = srcAdapterGroup.getAdapterVO(srcAdapterNames[0]);
|
|
String adapterPropGroupName = srcAdapter.getPropGroupName();
|
|
// PropManager manager = PropManager.getInstance();
|
|
AdapterPropManager manager = AdapterPropManager.getInstance();
|
|
|
|
String adptrPropVal = manager.getProperty(adapterPropGroupName, "inisafe.related.adapter.groups");
|
|
if (logger.isDebug())
|
|
logger.debug(guidLogPrefix + "" + adapterPropGroupName + " : inisafe.related.adapter.groups -> "
|
|
+ adptrPropVal);
|
|
|
|
if (adptrPropVal != null && adptrPropVal.trim().length() > 0) {
|
|
String[] adapter_list = adptrPropVal.split(",");
|
|
for (int p = 0; p < adapter_list.length; p++) {
|
|
String[] adapterNames = adapterManager.getAdapterGroupVO(adapter_list[p]).getAdapterNames();
|
|
for (int i = 0; i < adapterNames.length; i++) {
|
|
if (logger.isDebug())
|
|
logger.debug(guidLogPrefix + "startTargetAdapter :" + adapter_list[p] + " "
|
|
+ adapterNames[i]);
|
|
try {
|
|
adapterManager.getAdapterGroupVO(adapter_list[p]).getAdapterVO(adapterNames[i]).start();
|
|
} catch (Exception ex) {
|
|
if (logger.isWarn()) {
|
|
logger.warn(guidLogPrefix + "startTargetAdapter Fail :" + adapter_list[p] + " "
|
|
+ adapterNames[i], ex);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
if (logger.isDebug())
|
|
logger.debug(
|
|
guidLogPrefix + "inisafe.related.adapter.groups NOT FOUND :" + srcAdapterGroupName);
|
|
}
|
|
} else {
|
|
if (logger.isDebug())
|
|
logger.debug(guidLogPrefix + "srcAdapter NOT FOUND :" + srcAdapterGroupName);
|
|
}
|
|
} catch (Exception e) {
|
|
if (logger.isError()) {
|
|
logger.error(guidLogPrefix + "startTargetAdapter Error", e);
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|