본문으로 건너뛰기

통신망전문처리프로그램

프로그램용도구현할 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;
}
  1. 통신망 전문 종류별로 거래코드를 생성한다.
  2. 기관의 통신망 전문의 레이아웃에 맞는 통신망 전문을 생성한다.
  3. 생성한 통신망 전문을 대외기관에 전송 가능한 전문으로 변환한다.
  4. 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;
}
  1. 요청 통신망 전문에 따른 응답 전문을 생성한다.
  2. 위의 예제는 통신망 종별코드을 응답 종별코드로 변경하는 예제이다.
  3. 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;
}
  1. 수신받은 전문에서 전문종별 코드를 구한다.
  2. 수신받은 전문에서 업무구분 코드를 구한다.
  3. 종별코드가 통신망 전문이면서 입력으로 주어진 통신망 전문 종류와 같으면 true를 리턴한다.
  4. 위의 예제는 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;
}
}
  1. 수신받은 전문에서 전문종별 코드를 구한다.
  2. 종별코드가 통신망 전문이면 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();
}
}
  1. 통신망 전문이 아니면 리턴한다.
  2. 업무구분코드별로 상태코드를 리턴한다.
  3. 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();
}
}
}