통신망전문처리프로그램
프로그램용도 | 구현할 Java인터페이스 | 적용할 설정화면 |
---|---|---|
사용자호출프로그램 | NetMessageProcess | 기본설정관리 > 기관별업무정보 |
기관의 개시, 종료 상태를 FEP에서 관리하는 경우, 통신망 관리 프로그램을 이용하여 기관의 통신망 전문 대행응답이나 상태관리를 수행할 수 있다.
주의
기관의 통신망 상태를 관리하지 않는 기관이거나, 내부 업무시스템에서 관리하는 경우에는 사용하지 않는다.
통신망전문 종류
- 개시 당일 거래를 시작하기 전에 상대방과 업무 개시를 알리는 전문
- 종료 당일 거래를 모두 마친 후에 상대방과 업무를 종료하는 전문
- 종료예고 당일 업무가 조만간 종료하기 때문에 쌓여있는 거래가 있으면 빨리 끝내라는 전문
- 일시거래정지 일시적으로 거래를 정지하는 전문
- 일시거래해지 일시적으로 정지된 거래를 재개하는 전문
- 회선시험 폴링전문으로 채널이 끊어졌는지 확인하는 전문
개발방법
통신망전문은 통신망 처리가 동일하다면 하나의 프로그램으로 처리할 수 있지만, 전문 레이아웃과 전문 코드가 다르다면 대외기관별로 별도의 프로그램으로 처리해야 한다.
요청 통신망 전문 처리 API
대외기관에 요청 통신망 전문을 생성하는 API이다.
@Override
public byte[] requestMessage(String instCd, String bizCd, String netTypeCd, String netLayout) {
Map<String, Object> comHead = new LinkedHashMap<String, Object>();
// 1. Generate transaction code
BusinessOpenStatusEnum typeCd = BusinessOpenStatusEnum.getByCode(netTypeCd);
if (typeCd == BusinessOpenStatusEnum.POLLING) {
comHead.put("txCode", "POLLING");
} else if (typeCd == BusinessOpenStatusEnum.INITIATED) {
comHead.put("txCode", "STARTED");
}
// 2. Create management message
comHead.put("msgLen", "0081");
comHead.put("sysId", "90");
comHead.put("repInstCd", instCd);
comHead.put("msgCbtpCd", "0800");
if (typeCd == BusinessOpenStatusEnum.POLLING) {
comHead.put("msgBizDscd", "300");
} else if (typeCd == BusinessOpenStatusEnum.INITIATED) {
comHead.put("msgBizDscd", "101");
}
comHead.put("srFlag", "C");
comHead.put("rspsCd", "000");
comHead.put("brnchCd", "0020001");
Random random = new Random();
int fdrtnMsgNo = random.nextInt(9999999);
comHead.put("fnceInstMsgNo", String.format("%07d", fdrtnMsgNo));
comHead.put("fnceInstMsgTm",
DateUtil.getCurrentDate(DateUtil.EMPTY_MILL_DATE_TIME_TYPE).substring(0, 14));
comHead.put("fdrtnMsgNo", "0000000");
comHead.put("fdrtnMsgTm",
DateUtil.getCurrentDate(DateUtil.EMPTY_MILL_DATE_TIME_TYPE).substring(0, 14));
// 3. Create transfer message
byte[] array = (byte[]) Marshaller.marshal(MessageTypeEnum.FIXED_MESSAGE, netLayout,
comHead, null, false, null);
return array;
}
- 통신망 전문 종류별로 거래코드를 생성한다.
- 기관의 통신망 전문의 레이아웃에 맞는 통신망 전문을 생성한다.
- 생성한 통신망 전문을 대외기관에 전송 가능한 전문으로 변환한다.
- BXI는 생성된 전문을 해당 기관에 연결된 커넥션으로 전송한다.
☑ 입력
- instCd : 통신망 전문을 전송할 기관코드
- bizCd : 기관에 속한 업무코드
- netTypeCd : 통신망종류코드
- netLayout : 통신망 전문의 레이아웃 명
통신망종류코드
1: 개시, 2: 종료, 3: 종료예고, 5: 일시거래정지, 6: 일시거래정지해제, 7: 회선시험(폴링)
☑ 출력
- 입력으로 전달된 통신망 종류별로 생성된 전문
응답 통신망 전문 처리 API
대외기관에서 수신한 요청 통신망 전문에 대한 응답 전문을 생성하는 API이다.
@Override
public byte[] responseMessage(String instCd, String bizCd, String msgCbtpCd,
String msgBizDscd, byte[] message, String netLayout) {
// Change category code
byte[] response = new byte[message.length];
System.arraycopy(message, 0, response, 0, 20);
response[20] = '1';
System.arraycopy(message, 21, response, 21, (message.length - 21));
return response;
}
- 요청 통신망 전문에 따른 응답 전문을 생성한다.
- 위의 예제는 통신망 종별코드을 응답 종별코드로 변경하는 예제이다.
- BXI는 API에서 생성된 전문을 해당 기관에 연결된 커넥션으로 응답한다.
☑ 입력
- instCd : 통신망 전문을 수신한 기관코드
- bizCd : 기관에 속한 업무코드
- msgCbtpCd : 통신망 종별코드
- msgBizDscd : 통신망 업무구분코드 (개시, 종료, 종료예고, 장애)
- message : 수신받은 통신망 전문
- netLayout : 통신망 전문의 레이아웃 명
☑ 출력
- 통신망 요청전문에 대한 응답 전문
통신망 전문 검증 API
대외기관에서 수신한 통신망 전문이 등록된 통신망 전문인지 판단하는 API이다.
@Override
public boolean isMessage(String netTypeCd, byte[] message) {
// Communication category code
byte[] array = new byte[4];
System.arraycopy(message, 18, array, 0, 4);
String msgCbTpCd = new String(array);
// Communication business type code
array = new byte[3];
System.arraycopy(message, 22, array, 0, 3);
String msgBizCd = new String(array);
logger.debug("msgCbTpCd : [{}], msgBizCd : [{}]", msgCbTpCd, msgBizCd);
if ((msgCbTpCd.equals("0800") || msgCbTpCd.equals("0810"))) {
BusinessOpenStatusEnum typeCd = BusinessOpenStatusEnum.getByCode(netTypeCd);
if (typeCd == BusinessOpenStatusEnum.POLLING) {
return (msgBizCd.equals("300"));
}
}
return false;
}
- 수신받은 전문에서 전문종별 코드를 구한다.
- 수신받은 전문에서 업무구분 코드를 구한다.
- 종별코드가 통신망 전문이면서 입력으로 주어진 통신망 전문 종류와 같으면 true를 리턴한다.
- 위의 예제는 Polling 전문인지 판단하는 예제이다.
☑ 입력
- netTypeCd : 통신망종류코드
- message : 수신받은 통신망 전문
☑ 출력
- true : 입력으로 전달된 통신망 전문 종류와 같은 전문임
- false : 입력으로 전달된 통신망 전문 종류와 다른 전문임
통신망 전문 여부 검증 API
대외기관에서 수신한 전문이 통신망 전문인지 판단하는 API이다.
@Override
public boolean isMessage(String instCd, String bizCd, byte[] message) {
// Communication category code
byte[] array = new byte[4];
System.arraycopy(message, 18, array, 0, 4);
String msgCbTpCd = new String(array);
logger.debug("msgCbTpCd : [{}]", msgCbTpCd);
if ((msgCbTpCd.equals("0800") || msgCbTpCd.equals("0810"))) {
return true;
} else {
return false;
}
}
- 수신받은 전문에서 전문종별 코드를 구한다.
- 종별코드가 통신망 전문이면 true를 리턴한다.
☑ 입력
- instCd : 전문을 수신한 기관코드
- bizCd : 기관에 속한 업무코드
- message : 수신받은 전문
☑ 출력
- true : 수신받은 전문이 통신망 전문임
- false : 수신받은 전문이 통신망 전문이 아님
통신망 전문 상태코드 변환 API
BXI는 기관별로 통신망 상태를 관리한다. 즉, 통신망 상태가 개시전이면 전문을 대외기관에 전송할 수 없도록 제어한다.
통신망 전문 상태코드 변환 API는 대외기관에서 수신받은 통신망 전문을 업무구분코드별로 상태코드로 변환하는 API이다.
@Override
public String netStatus(String msgCbtpCd, String msgBizDscd, Map<String, Object> message) {
if (!msgCbtpCd.equals("0800") && !msgCbtpCd.equals("0810")) {
return BusinessOpenStatusEnum.UNKNOWN.getCode();
}
switch (Integer.parseInt(msgBizDscd)) {
case 101:
return BusinessOpenStatusEnum.INITIATED.getCode();
case 210:
return BusinessOpenStatusEnum.CLOSED.getCode();
case 300:
return BusinessOpenStatusEnum.POLLING.getCode();
case 400:
return BusinessOpenStatusEnum.ACCIDENT.getCode();
case 500:
return BusinessOpenStatusEnum.ACCIDENT_RECOVERY.getCode();
default:
return BusinessOpenStatusEnum.UNKNOWN.getCode();
}
}
- 통신망 전문이 아니면 리턴한다.
- 업무구분코드별로 상태코드를 리턴한다.
- BXI는 상태코드를 기관별로 데이터베이스에 반영한다.
☑ 입력
- msgCbtpCd : 통신망 종별코드
- msgBizDscd : 통신망 업무구분코드 (개시, 종료, 종료예고, 장애)
- message : 수신받은 전문을 Unmarshal한 데이터
☑ 출력
- 상태코드
전체 예제
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.concurrent.ThreadLocalRandom;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import bxi.api.NetMessageProcess;
import bxi.common.enums.BusinessOpenStatusEnum;
import bxi.common.enums.MessageTypeEnum;
import bxi.common.utility.DateUtil;
import bxi.parser.Marshaller;
@Component
public class NetMessageProcessImpl implements NetMessageProcess {
private final static Logger logger = LoggerFactory.getLogger(NetMessageProcessImpl.class);
@Override
public byte[] requestMessage(String instCd, String bizCd, String netTypeCd, String netLayout) {
Map<String, Object> comHead = new LinkedHashMap<String, Object>();
BusinessOpenStatusEnum typeCd = BusinessOpenStatusEnum.getByCode(netTypeCd);
if (typeCd == BusinessOpenStatusEnum.POLLING) {
comHead.put("txCode", "POLLING");
} else if (typeCd == BusinessOpenStatusEnum.INITIATED) {
comHead.put("txCode", "STARTED");
}
comHead.put("msgLen", "0081");
comHead.put("sysId", "90");
comHead.put("repInstCd", instCd);
comHead.put("msgCbtpCd", "0800");
if (typeCd == BusinessOpenStatusEnum.POLLING) {
comHead.put("msgBizDscd", "300");
} else if (typeCd == BusinessOpenStatusEnum.INITIATED) {
comHead.put("msgBizDscd", "101");
}
comHead.put("srFlag", "C");
comHead.put("rspsCd", "000");
comHead.put("brnchCd", "0020001");
int fdrtnMsgNo = ThreadLocalRandom.current().nextInt(9999999);
comHead.put("fnceInstMsgNo", String.format("%07d", fdrtnMsgNo));
comHead.put("fnceInstMsgTm",
DateUtil.getCurrentDate(DateUtil.EMPTY_MILL_DATE_TIME_TYPE).substring(0, 14));
comHead.put("fdrtnMsgNo", "0000000");
comHead.put("fdrtnMsgTm",
DateUtil.getCurrentDate(DateUtil.EMPTY_MILL_DATE_TIME_TYPE).substring(0, 14));
byte[] array = (byte[]) Marshaller.marshal(MessageTypeEnum.FIXED_MESSAGE, netLayout,
comHead, null, false, null);
return array;
}
@Override
public byte[] responseMessage(String instCd, String bizCd, String msgCbtpCd,
String msgBizDscd, byte[] message, String netLayout) {
// Change category code
byte[] response = new byte[message.length];
System.arraycopy(message, 0, response, 0, 20);
response[20] = '1';
System.arraycopy(message, 21, response, 21, (message.length - 21));
return response;
}
@Override
public boolean isMessage(String netTypeCd, byte[] message) {
// Communication category code
byte[] array = new byte[4];
System.arraycopy(message, 18, array, 0, 4);
String msgCbTpCd = new String(array);
// Communication business type code
array = new byte[3];
System.arraycopy(message, 22, array, 0, 3);
String msgBizCd = new String(array);
logger.debug("msgCbTpCd : [{}], msgBizCd : [{}]", msgCbTpCd, msgBizCd);
if ((msgCbTpCd.equals("0800") || msgCbTpCd.equals("0810"))) {
BusinessOpenStatusEnum typeCd = BusinessOpenStatusEnum.getByCode(netTypeCd);
if (typeCd == BusinessOpenStatusEnum.POLLING) {
return (msgBizCd.equals("300"));
}
}
return false;
}
@Override
public boolean isMessage(String instCd, String bizCd, byte[] message) {
// Communication category code
byte[] array = new byte[4];
System.arraycopy(message, 18, array, 0, 4);
String msgCbTpCd = new String(array);
logger.debug("msgCbTpCd : [{}]", msgCbTpCd);
if ((msgCbTpCd.equals("0800") || msgCbTpCd.equals("0810"))) {
return true;
} else {
return false;
}
}
@Override
public String netStatus(String msgCbtpCd, String msgBizDscd, Map<String, Object> message) {
if (!msgCbtpCd.equals("0800") && !msgCbtpCd.equals("0810")) {
return BusinessOpenStatusEnum.UNKNOWN.getCode();
}
switch (Integer.parseInt(msgBizDscd)) {
case 101:
return BusinessOpenStatusEnum.INITIATED.getCode();
case 210:
return BusinessOpenStatusEnum.CLOSED.getCode();
case 300:
return BusinessOpenStatusEnum.POLLING.getCode();
case 400:
return BusinessOpenStatusEnum.ACCIDENT.getCode();
case 500:
return BusinessOpenStatusEnum.ACCIDENT_RECOVERY.getCode();
default:
return BusinessOpenStatusEnum.UNKNOWN.getCode();
}
}
}