264 lines
13 KiB
Java
264 lines
13 KiB
Java
package com.eactive.eai.common.routing;
|
|
|
|
import java.util.Properties;
|
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
|
import com.eactive.eai.adapter.AdapterGroupVO;
|
|
import com.eactive.eai.adapter.AdapterManager;
|
|
import com.eactive.eai.adapter.AdapterVO;
|
|
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.message.ServiceMessage;
|
|
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.server.Keys;
|
|
import com.eactive.eai.common.util.Logger;
|
|
|
|
/**
|
|
* 1. 기능 : Flow Control에서 Outbound 를 호출하기 위한 Router
|
|
* 2. 처리 개요 :
|
|
* * - FlowControl에서 Outbound 를 호출한다.
|
|
* 3. 주의사항
|
|
*
|
|
* @author :
|
|
* @version : v 1.0.0
|
|
* @see : 관련 기능을 참조
|
|
* @since :
|
|
* :
|
|
*/
|
|
public class IFRouter
|
|
{
|
|
public static final String IFROUTER_ERROR_LOCAL = "RECEAICIR001"; // Local JPD 호출 오류
|
|
public static final String IFROUTER_ERROR_LOCK = "RECEAICIR002"; // Error발생하여 Failover가 불가능함(FailOver Flag=false)
|
|
public static final String IFROUTER_ERROR_REMOTE = "RECEAICIR003"; // FailOver증 JPD 호출 오류
|
|
public static final String IFROUTER_INVALID_ROUT = "RECEAICIR099"; // Outbound 이외의 Process를 호출하고록 설정된 경우
|
|
|
|
static Logger logger = Logger.getLogger(Logger.LOGGER_DEFAULT);
|
|
|
|
/**
|
|
* 1. 기능 : FlowCOntrol에서 Outbound Process로 라우팅하는 기능을 제공
|
|
* 2. 처리 개요 :
|
|
* - FlowControl에서 전달받은 EAIMessage의 Routing명을 통해 JPDProxy 방식으로 EAIMessage를 전달한다.
|
|
* 3. 주의사항
|
|
*
|
|
* @param eaiMessage Inbound에서 생성한 EAI표준메시지
|
|
* @param callProp 라우팅을 위한 환경값(추가적으로 보낼 인자가 있을 경우 사용)
|
|
* @return EAIMessage Outbound Process로부터 처리된 결과가 리턴됨
|
|
* @exception
|
|
**/
|
|
public static EAIMessage process(EAIMessage eaiMessage, Properties callProp) throws Exception {
|
|
ServiceMessage service = ((ServiceMessage)eaiMessage.getSvcMsgs().get( eaiMessage.getSvcPssSeq() - 1 ));
|
|
String routingName = service.getOutbRtnNm();
|
|
boolean isLocal = true; // EAIMessage내의 수동시스템인터페이스유형(AdapterGroupName)
|
|
|
|
// String guidLogPrefix = "IFRouter] GUID["+eaiMessage.getKbMsg().getKBHeader().getGuIdNo()+"] UUID["+eaiMessage.getSvcOgNo()+"] ";
|
|
String guidLogPrefix = "IFRouter] GUID["+eaiMessage.getMapper().getGuid(eaiMessage.getStandardMessage())+"] UUID["+eaiMessage.getSvcOgNo()+"] ";
|
|
|
|
// TAS 거래는 Local Call 로 처리하도록 한다. (2019.03.04)
|
|
EAIServerManager eaiServerManager = EAIServerManager.getInstance();
|
|
if(eaiServerManager.isTASEnabledEAIServer()) {
|
|
AdapterManager adapterManager = AdapterManager.getInstance();
|
|
AdapterGroupVO adptGrpVO = adapterManager.getAdapterGroupVO(service.getPsvSysItfTp());
|
|
if( EAIMessageKeys.TRANTYPE_TAS.equals(eaiMessage.getTranType())
|
|
// RESTAdapter는 교체하지 않는다
|
|
&& !StringUtils.equals(adptGrpVO.getType(), "RST")
|
|
&& !StringUtils.equals(adptGrpVO.getType(), "HTT")) {
|
|
// isLocal = true;
|
|
// if (logger.isInfo()) logger.info(guidLogPrefix + " TRANTYPE TAS [" + eaiMessage.getTranType() + "]");
|
|
PropManager manager = PropManager.getInstance();
|
|
Properties prop = manager.getProperties(RouteKeys.SIM);
|
|
routingName = prop.getProperty(RouteKeys.SIM_ROUTING,"HTTPOUT");
|
|
String simAdapterGroupName ="";
|
|
if (service.isSyncItfTp()){
|
|
simAdapterGroupName = prop.getProperty(RouteKeys.SIM_ADAPTER_SYNC,"_SIM_OU_HTT_SyC");
|
|
}else{
|
|
simAdapterGroupName = prop.getProperty(RouteKeys.SIM_ADAPTER_ASYNC,"_SIM_OU_HTT_AsC");
|
|
}
|
|
isLocal = isAlive(simAdapterGroupName);
|
|
}
|
|
else if( EAIMessageKeys.TRANTYPE_DUMMYROUT.equals(eaiMessage.getTranType()) ) {
|
|
isLocal = false;
|
|
if (logger.isInfo()) logger.info(guidLogPrefix + " TRANTYPE_DUMMYROUT [" + eaiMessage.getTranType() + "] Route to Other Domain - Local ["+System.getProperty(Keys.EAI_SYSTEMMODE)+"]");
|
|
}
|
|
else {
|
|
isLocal= isAlive( service.getPsvSysItfTp()); // EAIMessage내의 수동시스템인터페이스유형(AdapterGroupName)
|
|
}
|
|
}
|
|
else {
|
|
isLocal = isAlive( service.getPsvSysItfTp()); // EAIMessage내의 수동시스템인터페이스유형(AdapterGroupName)
|
|
}
|
|
RoutingVO routingUrl = RoutingManager.getInstance().getRoutingVO( routingName );
|
|
|
|
if (logger.isInfo()) {
|
|
logger.info(guidLogPrefix + "ROUTING NAME [" + routingName + "]");
|
|
logger.info(guidLogPrefix + "ROUTING URI [" + routingUrl + "]");
|
|
logger.info(guidLogPrefix + "TRANTYPE [" + eaiMessage.getTranType() + "]");
|
|
logger.info(guidLogPrefix + "isLocal [" + isLocal + "]");
|
|
}
|
|
|
|
//-----------------------------------------------------
|
|
// IFRouter에서는 Outbound Process만 호출할 수 있도록 체크(무한 Loop방지)
|
|
// 2006.02.24 - DHLEE
|
|
//-----------------------------------------------------
|
|
if(! "O".equals(routingUrl.getLayerDstcd()) ) {
|
|
throw new Exception(IFROUTER_INVALID_ROUT);
|
|
}
|
|
|
|
EAIMessage message = null;
|
|
if ( eaiMessage.getSvcPssTp().equals( EAIMessage.SINGLE_PROCESS )
|
|
|| eaiMessage.getSvcPssTp().equals( EAIMessage.COMPLEX_PROCESS ) ) {
|
|
// 단일 수동인터페이스 또는 복합거래 유형인 경우
|
|
|
|
if(!eaiServerManager.isPEAIServer() && EAIMessageKeys.TRANTYPE_DUMMYROUT.equals(eaiMessage.getTranType()) ) {
|
|
StringBuffer urlBuf = new StringBuffer();
|
|
|
|
EAIServerManager mgr = EAIServerManager.getInstance();
|
|
EAIServerVO server = mgr.getEAIServer( mgr.getLocalServerName());
|
|
|
|
// get Routing server info
|
|
PropManager propManager = PropManager.getInstance();
|
|
String remote_url = propManager.getProperty(RouteKeys.DUMMY_ROUTE_INFO, server.getName());
|
|
if(logger.isWarn()) {
|
|
logger.warn(guidLogPrefix + " : DUMMY ROUTE CALL - EAISvcCd="+ eaiMessage.getEAISvcCd()
|
|
+", remote_url : " +remote_url);
|
|
}
|
|
if(remote_url == null) {
|
|
String errorMsg = " Dummy Route info not found : Property Group[" + RouteKeys.DUMMY_ROUTE_INFO + "] Property["+server.getName()+"}";
|
|
logger.error(guidLogPrefix + errorMsg);
|
|
throw new Exception(errorMsg);
|
|
}
|
|
urlBuf.append( EAIServerVO.IIOP_PROTOCOL ).append("://");
|
|
urlBuf.append( remote_url );
|
|
|
|
callProp.setProperty( RouteKeys.REMOTE_CALL_URL, urlBuf.toString() );
|
|
|
|
if (logger.isInfo()) {
|
|
logger.info(guidLogPrefix + " DummyRoute Remote Call [" + urlBuf.toString() + "] RemoteProxyClient");
|
|
}
|
|
|
|
try {
|
|
if (logger.isDebug()) {
|
|
logger.debug(guidLogPrefix + " DummyRoute RemoteProxyClient call");
|
|
}
|
|
message = RemoteProxyClient.callProxyBean(eaiMessage, callProp);
|
|
if (logger.isDebug()) {
|
|
logger.debug(guidLogPrefix + " DummyRoute RemoteProxyClient result : "+message);
|
|
}
|
|
} catch(Exception e) {
|
|
logger.error(guidLogPrefix + " DummyRoute Remote Call Error", e);
|
|
//throw new Exception(IFROUTER_ERROR_REMOTE);
|
|
throw new Exception(ExceptionUtil.getErrorCode(e,IFROUTER_ERROR_REMOTE));
|
|
}
|
|
}
|
|
else if ( isLocal ) {
|
|
try {
|
|
message = ElinkESBProcessProxy.callElinkESBProcess( routingUrl.getSyncRoutingPath(), eaiMessage, true, callProp );
|
|
} catch(Exception e) {
|
|
//throw new Exception( IFROUTER_ERROR_LOCAL );
|
|
throw new Exception(ExceptionUtil.getErrorCode(e,IFROUTER_ERROR_LOCAL));
|
|
}
|
|
} else {
|
|
EAIServerManager mgr = EAIServerManager.getInstance();
|
|
EAIServerVO server = mgr.getEAIServer( mgr.getLocalServerName());
|
|
EAIServerVO backupSvr = mgr.getEAIServer( server.getFailoverSvr() );
|
|
|
|
if ( service.getFlOvrCls().equals( EAIMessage.YES_FLAG ) && backupSvr != null) {
|
|
//Properties prop = new Properties();
|
|
StringBuffer urlBuf = new StringBuffer();
|
|
urlBuf.append( EAIServerVO.IIOP_PROTOCOL ).append("://");
|
|
urlBuf.append( backupSvr.getAddress() ).append(":");
|
|
urlBuf.append( backupSvr.getRmiPort() );
|
|
|
|
callProp.setProperty( RouteKeys.REMOTE_CALL_URL, urlBuf.toString() );
|
|
|
|
if (logger.isInfo()) {
|
|
logger.info(guidLogPrefix + " FailOver Remote Call [" + urlBuf.toString() + "] RemoteProxyClient");
|
|
}
|
|
|
|
try {
|
|
if (logger.isDebug()) {
|
|
logger.debug(guidLogPrefix + " FailOver RemoteProxyClient call");
|
|
}
|
|
message = RemoteProxyClient.callProxyBean(eaiMessage, callProp);
|
|
if (logger.isDebug()) {
|
|
logger.debug(guidLogPrefix + " FailOver RemoteProxyClient result : "+message);
|
|
}
|
|
} catch(Exception e) {
|
|
logger.error(guidLogPrefix + " FailOver Remote Call Error - " + e.getMessage());
|
|
// e.printStackTrace();
|
|
//throw new Exception(IFROUTER_ERROR_REMOTE);
|
|
throw new Exception(ExceptionUtil.getErrorCode(e,IFROUTER_ERROR_REMOTE));
|
|
}
|
|
}
|
|
else {
|
|
throw new Exception( ExceptionUtil.make(IFROUTER_ERROR_LOCK , new String[1]) );
|
|
}
|
|
}
|
|
} else {
|
|
try {
|
|
if (logger.isDebug()) {
|
|
logger.debug(guidLogPrefix + " PCOMPLEX [" + routingUrl.getSyncRoutingPath() + "]");
|
|
}
|
|
message = ElinkESBProcessProxy.callElinkESBProcess( routingUrl.getSyncRoutingPath(), eaiMessage, true, callProp );
|
|
} catch(Exception e) {
|
|
//throw new Exception( IFROUTER_ERROR_LOCAL );
|
|
throw new Exception(ExceptionUtil.getErrorCode(e,IFROUTER_ERROR_LOCAL));
|
|
}
|
|
}
|
|
|
|
return message;
|
|
}
|
|
|
|
/**
|
|
* 1. 기능 : Adapter그룹명의 Adapter들의 상태정보를 확인하는 메소드
|
|
* 2. 처리 개요 :
|
|
* - AdapterManager를 통해 해당 Adapter그룹의 Adapter의 상태를 확인하여
|
|
* 정상적인 Adapter가 있는지 여부를 리턴한다.
|
|
* 3. 주의사항
|
|
*
|
|
* @param adapterGroupName Adapter그룹명
|
|
* @return boolean
|
|
* @exception Exception
|
|
**/
|
|
public static boolean isAlive(String adapterGroupName) throws Exception {
|
|
//-------------------------------------------------
|
|
// CISCO Router에 대한 처리로직 추가 : 2007.06.15 DHLEE
|
|
//-------------------------------------------------
|
|
String cadapterGroupName = "";
|
|
String cadapterName = "";
|
|
|
|
if (adapterGroupName.indexOf('.') != -1) {
|
|
cadapterName = adapterGroupName.substring(adapterGroupName.indexOf('.')+1);
|
|
cadapterGroupName = adapterGroupName.substring(0, adapterGroupName.indexOf('.'));
|
|
}
|
|
else {
|
|
cadapterGroupName = adapterGroupName;
|
|
}
|
|
|
|
AdapterGroupVO adapterGroup = AdapterManager.getInstance().getAdapterGroupVO( cadapterGroupName );
|
|
if(adapterGroup==null) {
|
|
throw new Exception("IFRouter] Cannot find the AdapterGroupVO. - "+ cadapterGroupName);
|
|
}
|
|
if (adapterGroupName.indexOf('.') != -1) {
|
|
AdapterVO vo = adapterGroup.getAdapterVO(cadapterName);
|
|
|
|
if (vo == null) {
|
|
return false;
|
|
}else{
|
|
//라우팅 특정 포트 매핑시 어댑터 업무 이름 선택시 오류 수정
|
|
//isStarted 체크는 node를 변경한경우 대비
|
|
if (vo.isStarted() && vo.isStatus()){
|
|
return true;
|
|
}else{
|
|
return false;
|
|
}
|
|
}
|
|
}else{
|
|
return adapterGroup.isAlive();
|
|
}
|
|
}
|
|
}
|