본문으로 건너뛰기
버전: 3.4.4

라우터프로그램

프로그램용도구현할 Java인터페이스유의사항
라우터 프로그램RouteBuilder플로우관리>라우터정보
라우터 프로그램RouterProcessor라우터정보>처리프로그램

기본 라우터 외에 신규 라우터를 추가하고자 하는 경우 사용한다. 라우터 프로그램 및 라우터 처리프로그램을 함께 개발해야 한다.

개발방법

라우터 처리 프로그램은 RouterProcessor를 상속 받아 process 메소드를 구현해야 한다. 아래 예제는 대내시스템에서 수신된 전문이 Dummy 전문 여부를 판단하는 라우터를 개발하고, 해당 라우터에서 호출하는 라우터 처리 프로그램 예제이다.

주의

라우터 프로그램은 개발 후 플로우관리 > 라우터정보에 등록해서 사용해야 한다. 라우터 프로그램은 동적으로 추가는 가능하나 변경은 할 수 없으므로 라우터 프로그램을 변경한 경우에는 BXI를 재실행해야 한다.

라우터 프로그램

Apache camel의 RouteBuilder를 구현한다.

public class InternalResponseDistinctRouter extends RouteBuilder {

/** Router process bean name */
private final String beanName;

/**
* Constructor
*
* @param beanName
*/
public InternalResponseDistinctRouter(String beanName) {
this.beanName = beanName;
}

/**
* Let's configure the Camel routing rules using Java code...
*/
@Override
public void configure() {
Processor nameProcess = RouterUtil.routerTemporaryProcess(beanName);

interceptFrom().setHeader(CamelHeader.ROUTER_ID, constant("internalResponseDistinctRouter"))
.routeId("internalResponseDistinctRouter").process("loggingPreProcessor");
from("direct:internalResponseDistinct").routeId("internalResponseDistinctRouter")
.process(nameProcess)
.process("routerBeanCallProcessor")
.end().process("loggingPostProcessor");
}
}

1. 라우터에서 처리할 프로그램 입력

public class InternalResponseDistinctRouter extends RouteBuilder {

/** Router process bean name */
private final String beanName;

/**
* Constructor
*
* @param beanName
*/
public InternalResponseDistinctRouter(String beanName) {
this.beanName = beanName;
}

라우터 프로그램 생성자를 통하여 처리 프로그램을 입력 받는다. 입력되는 처리 프로그램은 반드시 Spring Bean 프로그램이어야 한다.

2. 라우터 처리 Configure

@Override
public void configure() {

RouteBuilder의 configure 메소드를 구현한다.

configure 메소드는 라우터가 메시지를 받아서 처리할 부분에 대해서 순서대로 기술하는 부분이다. configure 메소드에 기술하는 라우터 ID는 라우터를 식별하는 ID로 Unique 해야한다. 또한 from 절의 URL는 외부에서 해당 라우터를 호출할 때 사용하는 URL로써 Unique해야 한다.

3. 라우터 처리 프로그램 전달 준비

Processor nameProcess = RouterUtil.routerTemporaryProcess(beanName);

입력으로 받은 프로그램을 직접 .process()의 인자로 넘겨 줄수가 없다. 그래서 Processor interface의 inner 객체를 하나 생성하고 입력 받은 프로그램을 Exchange의 in 영역의 헤더를 통하여 전달한다.

이렇게 하는 이유는 .process()로 호출되는 모든 처리 프로그램의 인자는 항상 Exchange이기 때문이다. 하나의 라우터에서 다른 라우터를 호출할 때 입력으로 전달되는 메시지는 Exchange in 영역으로 전달하고, Exchange in이나 out 영역으로 결과를 받는다.

4. 라우터 입력 로깅

interceptFrom().setHeader(CamelHeader.ROUTER_ID, constant("internalResponseDistinctRouter"))
.routeId("internalResponseDistinctRouter").process("loggingPreProcessor");

라우터 프로그램의 처리 시작은 항상 from으로부터 시작한다.

BXI의 라우터는 라우터 입력과 출력에 대해서 로깅을 할수 있는데, 이를 처리하기 위해 from을 인터셉트하여 먼저 입력에 대한 로깅을 한다. loggingPreProcessor에 입력으로 전달되는 인자는 from에서 받은 Exchange 이다.

5. 라우터 처리 프로그램 호출

from("direct:internalResponseDistinct").routeId("internalResponseDistinctRouter")
.process(nameProcess)
.process("routerBeanCallProcessor")

외부에서 라우터를 호출하는 URL는 from 절에 기술한 direct:internalResponseDistinct이다.

즉, 라우터를 대표하는 URL이라고 할 수 있으며, 중복되면 에러가 발생하므로 라우터마다 Unique한 URL을 부여해야 한다. BXI는 라우터 정보를 등록할 때 라우터의 URL도 같이 등록하여 플로우를 생성할 때 사용한다.

외부에서 direct:requestHeaderMapping으로 라우터를 호출하면, 먼저 라우터 처리 프로그램 전달 준비의 프로세스를 먼저 실행하여 입력으로 받은 프로그램을 Exchange의 in 영역의 헤더에 저장한다.

다음으로 routerBeanCallProcessor 프로그램은 Exchange을 입력으로 받아 in 영역의 헤더에서 라우터 처리 프로그램을 조회하여 프로그램을 호출한다. routerBeanCallProcessor는 BXI에서 라우터 처리 프로그램을 호출하는 Utility이다.

라우터 처리 프로그램을 호출할 때 입력으로는 from에서 받은 Exchange이다.

6. 라우터 출력 로깅

.end().process("loggingPostProcessor");

라우터의 모든 처리가 끝나면 마지막으로 라우터의 출력에 대한 로깅을 처리한다. 출력를 로깅하는 loggingPostProcessor는 Exchange를 입력으로 받아 로깅 한다.

라우터 처리 프로그램

bxi.api-{version}.jarRouterProcessor를를 구현한다.

@Component
public class InternalResponseDistinctProcessor extends RouterProcessor {
private final Logger logger = LoggerFactory.getLogger(this.getClass());

/**
* Processes the message exchange
*
* @param exchange
* @throws Exception
*/
@Override
public void process(ProcessorExchange exchange) throws Exception {
ExchangeMessage bxiMessage = exchange.getBxiMessage();
logger.debug("Input getBody : {}", bxiMessage);

// TODO : Writing the program for the router function

RequestResponseKindEnum rqstRspsDscd = RequestResponseKindEnum.getByCode(
bxiMessage.getRqstRspsDscd());
if (RequestResponseKindEnum.REQUEST == rqstRspsDscd) {
return;
}

Map<String, Object> header = ObjectUtil.isEmpty(bxiMessage.getStdHeader())
? bxiMessage.getComHeader() : bxiMessage.getStdHeader();
logger.debug("header : {}", header);

if ("DMY".equals(header.get("rspsCd"))) {
logger.info("Skip message. Dummy response. guid : {}", bxiMessage.getGuid());
// 다음 Router Stop 처리를 위해 Header Set
exchange.setProperty(Exchange.ROUTE_STOP, Boolean.TRUE);
}
}
}

1. 라우터 처리 프로그램 시작

@Override
public void process(ProcessorExchange exchange) throws Exception {
ExchangeMessage bxiMessage = exchange.getBxiMessage();
logger.debug("Input getBody : {}", bxiMessage);

process 메소드는 파라미터로 ProcessorExchange를 받는다.

2. 라우터 처리 프로그램 개발

RequestResponseKindEnum rqstRspsDscd = RequestResponseKindEnum.getByCode(
bxiMessage.getRqstRspsDscd());
if (RequestResponseKindEnum.REQUEST == rqstRspsDscd) {
return;
}

Map<String, Object> header = ObjectUtil.isEmpty(bxiMessage.getStdHeader())
? bxiMessage.getComHeader() : bxiMessage.getStdHeader();
logger.debug("header : {}", header);

if ("DMY".equals(header.get("rspsCd"))) {
logger.info("Skip message. Dummy response. guid : {}", bxiMessage.getGuid());
// 다음 Router Stop 처리를 위해 Header Set
exchange.setProperty(Exchange.ROUTE_STOP, Boolean.TRUE);
}

이 부분에 라우터의 기능에 맞는 프로그램을 개발한다. 위의 예제는 해당 전문이 요청 전문이면서 Dummy 전문인 경우에 처리를 중단하는 예제이다.