Files
elink-online-common/src/main/java/com/eactive/eai/common/routing/IFRouter.java
T

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();
}
}
}