배치 작업 제어

배치의 유형에는 일반 배치, 온디맨드 배치, 데몬배치가 있다. 각각의 배치 유형에 대해서 배치 실행과 관련하여 제어 및 설정 처리를 해야 하는 경우가 있다. 본장은 배치 실행 및 제어와 관련된 테이블에 대해서 어덯게 커스터마이징을 해야 하는지에 대하 소개한다.

1. 배치 작업 정보 테이블

배치 프레임워크는 배치 작업 정보를 관리하는 테이블이 존재한다. 일반 배치와 온디맨드 배치는 배치작업정보(BXM_JOB_INFO) 테이블에서 관리를 하고, 데몬 배치의 경우에는 별도의 배치데몬정보(BXM_DAEMON_JOB_INFO)테이블에서 관리를 한다.

다음은 배치작업 정보 테이블에 대한 설명이다.

1.1. 배치작업정보 테이블(BXM_JOB_INFO)

상세 설명

  • 도메인ID (DOMAIN_ID)

  • 배치작업(Job) ID (JOB_ID)

    배치 실행 시 입력되는 Job Id (Spring Batch에서는 Job Name이라고 함) 로서, 배치작업 정보 테이블을 조회하기 위한 Key 값으로 사용된다.

  • 배치작업명 (JOB_NM)

    배치작업 Id의 한글 명이다.

  • 배치작업유형코드 (JOB_TYPE_CD)

    배치작업의 유형의 정의하여 놓은 코드 값이다. 배치 선처리에서 실행 유형에(일반,온디맨드배치) 에 따라서 실행 제어 처리를 할 수 있다.

배치작업유형코드
배치작업유형코드 설명

G

일반배치

R

온디맨드배치

A

일반배치 + 온디맨드배치

  • 배치 Application Id (BXM_APP_ID)

    배치가 정의 되어 있는 배치 어플리케이션을 의미한다. 또한 배치 어플리케이션은 배치 실행 시 입력되는 어플리케이션 명을 의미한다.

  • 배치 사용 여부 (USE_YN)

    실행되는 배치가 실행 할 수 있는지에 대하여 판단할 수 있는 Flag 값이다. 만일 배치 사용을 중지 하려면 해당 값으로 제어를 하면 된다.

  • 배치 로그레벨

    실행되고 있는 배치의 로그레벨을 의미한다. 로그레벨로 정의할 수 있는 값은 다음과 같다. (참고 : 로그레벨은 logback의 로그레벨과 동일하게 처리가 된다.)

Application Loglevel
Log Level 설명

DEFAULT

logback.xml에 설정된 로그레벨을 사용

TRACE

경로 추적을 위하여 사용 (DEBUG 로그레벨보다 좀더 상세하게 처리가 필요한 경우 사용)

DEBUG

일반적인 로그를 상세하게 남겨야 되는 경우 사용

INFO

정보성 로그를 남겨야 되는 경우 사용

WARN

에러는 아니지만 주의(경고)가 필요할 경우에 사용

ERROR

일반적인 에러가 발생하였을 경우 사용

로그레벨은 3개의 Layer로 나위어 있으며, Layer은 아래와 같다.

참고 : Layer는 3개로 나뉘어져 있으며 logLayer.properties에 설정한다.

로그레벨 Layer
업무 로그레벨 (BIZ_LOG_LV) logLayer.properties에 'BIZ’로 설정된 package 이하에 적용되는 클래스

DB 로그레벨 (DB_LOG_LV)

logLayer.properties에 'DB’로 설정된 package 이하에 적용되는 클래스

시스템 로그레벨 (SYS_LOG_LV)

'BIZ', 'DB’에 설정되지 않은 클래스

  • 배치 Step Commit Interval (COMMIT_CFG_LIST)

    Chunk-Oriented 방식의 Step에서 Commit 주기를 적용할 때 사용하는 값으로, "Step명=CommitCount;Step명=CommitCount" 값으로 정의하여 사용되어 진다.

    참고 : 3.0 버전에서 부터는 배치작업 xml에 commit-interval 속성을 정의하지 않아도 배치적업정보 테이블에 정의되어 있는 값으로 설정이 된다. 만일 배치작업정보 테이블에 commit-interval을 정의하지 않으면 배치 Instance Configuration 파일에 정의되어 있는 commit-interval 값이 적용이 된다.

  • 프로세스 중복 실행 가능 여부 (PROCESS_DUP_EXEC_YN)

    동일한 이름을 가진 배치 Job의 동시 실행을 방지하기 위하여 사용되어지는 값으로, 동시 실행의 판단은 배치 프로세스 간 JMX통신을 이용하여 처리한다.

  • 파라미터 중복 실행 가능 여부 (PARAM_DUP_EXEC_YN)

    스프링배치에서는 배치 Job 실행이 완료된 후, 완료된 배치 Job 의 실행 시 입력한 파라미터와 동일하게 입력이 되면 중복 실행이 되므로 에러가 발생이 된다. 해당 파라미터는 중복 실행과 상관이 없는 배치 Job 인 경우 동일 파라미터로 배치가 실행이 되더라도 배치 실행이 가능하게 끔 하도록 하는 배치 Job 파라미터 값이다.

    참고 : 해당 설정이 여(Y)로 설정이 되는 경우 에러가 발생 한 시점 부터 재실행 되지 않는다.

  • 기준일자 (STD_DT)

    배치 Job을 실행을 하기 위한 기준일자를 정의한다.

    기준일자는 기준일자 구분코드(STD_DT_DSCD), 일자 전후 구분코드(DT_BEF_AFT_DSCD), 일자 전후 일수(DT_BEF_AFT_DAY_CNT) 를 기준을 설정된다.

    참고 : 기본적으로 기준일자는 배치 실행 파라미터에 추가가 되어 처리가 되며, 만일 기준일자 설정이 필요하지 않을 경우에는 배치 시스템 선처리에서 해당 처리를 제외하면 된다.

  • 배치작업 시작일자 (JOB_USE_START_DT)

    배치가 수행할 수 있는 시작일자를 의미한다. 정의된 일자보다 이전에 실행되는 배치는 수행 시 에러가 발생한다.

  • 배치작업 종료일자 (JOB_USE_END_DT)

    배치가 수행할 수 있는 종료일자를 의미한다. 정의된 일자보다 이후에 실행되는 배치는 수행 시 에러가 발생한다.

  • 디폴트커밋인터벌 (DEFAULT_COMMIT_INTVL)

    Step의 기본 커밋 인터벌(commit-interval)을 나타내며, xml 혹은 COMMIT_CFG_LIST에 commit-interval 속성을 정의하지 않아도 기본적으로 설정되는 commit-interval 값을 의미한다.

1.2. 배치작업정보 확장 테이블(BXM_JOB_INFO_EXT)

상세 설명

  • 도메인ID (DOMAIN_ID)

  • 배치작업(Job) ID (JOB_ID)

    배치 실행 시 입력되는 Job Id (Spring Batch에서는 Job Name이라고 함) 로서, 배치작업 정보 테이블을 조회하기 위한 Key 값으로 사용된다.

  • 건수 명(CNT_1_NM ~ CNT_20_NM)

    배치 실행 결과에서 건수 정보의 논리명을 보여줄 때 사용된다.

  • 금액 명(AMT_1_NM ~ AMT_20_NM)

    배치 실행 결과에서 금액 정보의 논리명을 보여줄 때 사용된다.

1.3. 배치데몬정보(BXM_DAEMON_JOB_INFO)

상세 설명

  • 도메인ID (DOMAIN_ID)

  • 데몬배치작업(Job) Id (JOB_ID)

    데몬배치 수행시 키가 되는 데몬배치의 Job Id (Spring Batch에서는 Job Name이라고 함) 로서, 데몬배치작업 테이블을 조회하기 위한 Key 값으로 사용된다.

  • 데몬배치작업명 (JOB_NM)

    데몬배치작업 Id의 한글 명이다.

  • 배치 Application Id (BXM_APP_ID)

    배치가 정의 되어 있는 배치 어플리케이션을 의미한다.

  • 데몬배치 사용 여부 (USE_YN)

    데몬배치가 실행 할 수 있는지에 대하여 판단할 수 있는 Flag 값이다. 만일 데몬배치 사용을 중지 하려면 해당 값으로 제어를 하면 된다.

  • 배치 로그레벨

    실행되고 있는 배치의 로그레벨을 의미한다. 로그레벨로 정의할 수 있는 값은 다음과 같다. (참고 : 로그레벨은 logback의 로그레벨과 동일하게 처리가 된다.)

Application Loglevel
Log Level 설명

DEFAULT

logback.xml에 설정된 로그레벨을 사용

TRACE

경로 추적을 위하여 사용 (DEBUG 로그레벨보다 좀더 상세하게 처리가 필요한 경우 사용)

DEBUG

일반적인 로그를 상세하게 남겨야 되는 경우 사용

INFO

정보성 로그를 남겨야 되는 경우 사용

WARN

에러는 아니지만 주의(경고)가 필요할 경우에 사용

ERROR

일반적인 에러가 발생하였을 경우 사용

로그레벨은 3개의 Layer로 나위어 있으며, Layer은 아래와 같다.

참고 : Layer는 3개로 나뉘어져 있으며 logLayer.properties에 설정한다.

로그레벨 Layer
업무 로그레벨 (BIZ_LOG_LV) logLayer.properties에 'BIZ’로 설정된 package 이하에 적용되는 클래스

DB 로그레벨 (DB_LOG_LV)

logLayer.properties에 'DB’로 설정된 package 이하에 적용되는 클래스

시스템 로그레벨 (SYS_LOG_LV)

'BIZ', 'DB’에 설정되지 않은 클래스

  • 데몬배치 Step의 Commit Interval (COMMIT_CFG_LIST)

    Chunk-Oriented 방식의 Step에서 Commit 주기를 적용할 때 사용하는 값으로, "Step명=CommitCount;Step명=CommitCount" 값으로 정의하여 사용되어 진다.

    참고 : 3.0 버전에서 부터는 배치작업 xml에 commit-interval 속성을 정의하지 않아도 데몬배치적업정보 테이블에 정의되어 있는 값으로 설정이 된다. 만일 데몬배치작업정보 테이블에 commit-interval을 정의하지 않으면 배치 Instance Configuration 파일에 정의되어 있는 commit-interval 값이 적용이 된다.

  • 데몬배치 실행 아규먼트 (EXEC_ARGS)

    데몬배치 수행 시 입력되는 아규먼트 값이다. 입력 값은 Key=Value 형식으로 정의되어야 한다.

  • 데몬배치 실행 주기 (EXEC_INTVL_SEC)

    데몬배치 실행 주기를 의미한다. 실행 주기 단위는 (초). 주기 시간의 계산은 데몬배치의 수행 종료 시점부터 계산된다.

  • 데몬배치 Cron 설정 값 (CRON_EXEC_CFG_VAL)

    Cron의 형태로 데몬 주기를 설정하는 값을 의미한다.

    예) 0 0 0 * * SUN-SAT → 일요일 부터 토요일 까지 매일 0시에 데몬 배치가 수행이 된다.

  • 데몬배치 동시 실행 가능여부 (PARLL_EXEC_YN)

    데몬배치가 여러 노드에서 수행이 될때 동시에 실행 할 수 있는지에 대한 여부 값이다.

  • 에러 발생 시 중지여부 (ERR_STOP_YN)

    데몬배치가 수행 중에 에러가 발생할 경우 데몬 배치를 중지할 것인지, 아니면 무시하고 계속 수행 할 것인지에 대한 값이다.

  • 기준일자 (STD_DT)

    배치 Job을 실행을 하기 위한 기준일자를 정의한다.

    기준일자는 기준일자 구분코드(STD_DT_DSCD), 일자 전후 구분코드(DT_BEF_AFT_DSCD), 일자 전후 일수(DT_BEF_AFT_DAY_CNT) 를 기준을 설정된다.

    참고 : 기본적으로 기준일자는 배치 실행 파라미터에 추가가 되어 처리가 되며, 만일 기준일자 설정이 필요하지 않을 경우에는 배치 시스템 선처리에서 해당 처리를 제외하면 된다.

  • 실행시작시간 (EXEC_START_TIME)

    데몬배치가 시작하는 시간을 설정한다. 기본 값은 000000(0시) 이다.

  • 실행종료시간 (EXEC_END_TIME)

    데몬배치가 종료하는 시간을 설정한다. 기본 값은 235959(23시 59분 59초) 이다.

  • 디폴트커밋인터벌 (DEFAULT_COMMIT_INTVL)

    Step의 기본 커밋 인터벌(commit-interval)을 나타내며, xml 혹은 COMMIT_CFG_LIST에 commit-interval 속성을 정의하지 않아도 기본적으로 설정되는 commit-interval 값을 의미한다.

2. 배치작업정보(BXM_JOB_INFO) 테이블 로드

배치작업정보 테이블을 로드 하기 위해서 다음과 같은 Interface를 제공하고 있다.

2.1. BatchControlParameters Interface

배치작업정보 테이블 로드하기 위한 Interface로서, 배치작업정보 테이블을 수정 하는 경우에 해당 Interface를 이용하여 구현하면 된다.

BatchControlParameters Interface의 구현 Method는 다음과 같다.

    public interface BasicBatchControlParameters {
        public void loadBatchControlParameters(String jobId, DataSource datasource);
        public ApplicationLogLevel getSysLogLevel();
        public ApplicationLogLevel getBizLogLevel();
        public ApplicationLogLevel getDBLogLevel();
        public boolean isParamDupExecUseYn();
        public String getCommitCfgList();
        public String getStdDtDscd();
        public String getDtBefAftDscd();
        public int getDtBefAftDayCnt();
    }

    public interface BatchControlParameters extends BasicBatchControlParameters {
        public BatchControlParameters getBatchControlParameters();
        public String getDomainId();
        public String getJobId();
        public String getJobNm();
        public BatchJobControlType getJobTypeCd();
        public String getBxmAppId();
        public boolean isUseYn();
        public ApplicationLogLevel getSysLogLevel();
        public ApplicationLogLevel getBizLogLevel();
        public ApplicationLogLevel getDBLogLevel();
        public String getCommitCfgList();
        public String getJobUseStartDt();
        public String getJobUseEndDt();
        public boolean isStdDtParamUseYn();
        boolean isProcessDupExecUseYn();
        boolean isParamDupExecUseYn();
    }

2.1.1. loadBatchControlParameters() Method

배치 실행 시 입력되어진 Job ID 로 배치작업정보 테이블(BXM_JOB_INFO)을 조회하여 BatchControlParameters 객체에 조회한 정보를 설정한다.

loadBatchControlParameters() Method 설명

속성

설명

파라미터

String jobId

배치 실행 시 입력한 Job ID.

DataSource dataSource

배치작업정보 테이블을 조회 처리하기 위한 DataSource.

반환값

void

2.1.2. getBatchControlParameters() Method

배치작업정보 테이블에서 조회한 배치작업정보를 담고 있는 BatchControlParameters Object를 가져온다.

2.1.3. 배치작업정보 Getter Method

배치작업정보 테이블(BXM_JOB_INFO)의 거래 제어 항목을 Getting 하기 위한 Method이다.

배치작업정보 Getter Method 설명
Method 반환값 설명

getDomainId()

String

도메인ID

getJobId()

String

배치작업(Job)ID

getJobName()

String

배치작업명

getBxmAppId()

String

배치의 Application Id

getJobTypeCd()

BatchJobControlType

배치작업유형코드

isUseYn()

boolean

배치 사용 여부

getSysLogLevel()

ApplicationLogLevel

시스템 로그레벨

getBizLogLevel()

ApplicationLogLevel

업무 로그레벨

getDBLogLevel()

ApplicationLogLevel

DB 로그레벨

getCommitCfgList()

String

배치 Step의 Commit Interval

isProcessDupExecUseYn()

boolean

프로세스 중복 실행 가능 여부

isParamDupExecUseYn()

boolean

파라미터 중복 실행 가능 여부

getStdDtDscd()

String

기준일자 구분코드

getDtBefAftDscd

String

일자 전후 구분코드

getDtBefAftDayCnt

String

일자 전후 일수

getJobUseStartDt()

String

배치작업 시작일자

getJobUseEndDt()

String

배치작업 종료일자

isStdDtParamUseYn()

boolean

기준일자 파라미터 사용 여부

2.2. Sample Source

자세한 Source Sample은 bxm-batch-default-extension 프로젝트의 DefaultBatchControlParameters.java 를 참고한다.

public class DefaultBatchControlParameter implements BatchControlParameters{

    private BatchControlParameters batchControlParameters;

    private BatchControlParameterDto batchParamInfo;

    private boolean useYn;
    private BatchJobControlType batchJobControlType;
    private ApplicationLogLevel sysLogLevel;
    private ApplicationLogLevel bizLogLevel;
    private ApplicationLogLevel dbLogLevel;
    private boolean processDupExecUseYn;
    private boolean paramDupExecUseYn;
    private boolean stdDtParamUseYn;

    ...

    /**
     * 배치 Job 정보를 조회한다.
     * @param jobId 배치 JOB ID
     * @param dataSource DataSource
     * @throws BatchJobNotFoundException
     */
    public void loadBatchControlParameters(String jobId) throws BatchJobNotFoundException
    {
        try
        {
            BatchControlMapper batchControlMapper = JdbcOperatorUtils.getMapper(BatchControlMapper.class);
            BatchControlParameterDto paramInfo =
                    batchControlMapper.selectBxmBatchJobInfo(BatchApplicationContext.getDomainId(), jobId);

            if(paramInfo != null)
            {
                this.batchJobControlType = BatchJobControlType.ALL.getValue(paramInfo.getJobTypeCd());
                this.useYn = BatchCommYN.valueOf(paramInfo.getUseYn()).getBoolean();
                this.sysLogLevel = getLogLevel(jobId, paramInfo.getSysLogLvNm(), Layer.SYS);
                this.bizLogLevel = getLogLevel(jobId, paramInfo.getBizLogLvNm(), Layer.BIZ);
                this.dbLogLevel = getLogLevel(jobId, paramInfo.getDbLogLvNm(), Layer.DB);
                if(StringUtils.isEmpty(paramInfo.getProcessDupExecYn())){
                    paramInfo.setProcessDupExecYn("Y");
                }
                this.processDupExecUseYn = BatchCommYN.valueOf(paramInfo.getProcessDupExecYn()).getBoolean();
                if(StringUtils.isEmpty(paramInfo.getParamDupExecYn())){
                    paramInfo.setParamDupExecYn("Y");
                }
                this.paramDupExecUseYn = BatchCommYN.valueOf(paramInfo.getParamDupExecYn()).getBoolean();
                if(StringUtils.isEmpty(paramInfo.getStdDtParamUseYn())){
                    paramInfo.setStdDtParamUseYn("Y");
                }
                this.stdDtParamUseYn = BatchCommYN.valueOf(paramInfo.getStdDtParamUseYn()).getBoolean();


                if(StringUtils.hasText(paramInfo.getDsAllwList()))
                {
                    String[] dslist = paramInfo.getDsAllwList().split("\\,");;
                    this.dataSourceAllowList = Arrays.asList(dslist);
                }

                batchControlParameters = this;

                paramInfo.setDomainId(BatchApplicationContext.getDomainId());
                paramInfo.setJobId(jobId);

                this.batchParamInfo = paramInfo;
            }
            else
            {
                if(!BatchApplicationContext.isModuleTest())
                {
                    throw new BatchJobNotFoundException(BatchApplicationContext.getDomainId(), jobId);
                }
                else
                {
                    initModuleTest();
                }
            }
        }
        catch (BatchJobNotFoundException e)
        {
            logger.warn("load batch control parameters for [{}]is failed.", new Object[]{ jobId}, e);
            throw e;
        }
        catch (Throwable th)
        {
            logger.warn("load batch control parameters for [{}]is failed.", new Object[]{ jobId}, th);
            throw new IllegalStateException(th);
        }
    }

    @Override
    public BatchControlParameters getBatchControlParameters()
    {
        return this.batchControlParameters;
    }

    /**
     * 로그레벨 설정
     * @param jobId 배치 JOB ID
     * @param logLevel 로그레빌(String)
     */
    private ApplicationLogLevel getLogLevel(String jobId, String logLevel, LoggerLayer.Layer layer)
    {
        ApplicationLogLevel appLogLevel = null;
        try
        {
            // 로그레벨 설정
            if(StringUtils.hasText(logLevel))
            {
                // 온디맨드 배치에서는 context가 생성되기 전이기 때문에 파라미터로 넘겨 JobLauncer에서 생성하여 처리하도록 한다.
                if(BxmBatchConstants.BATCH_DEFAULT_LOG_LEVEL.equals(logLevel.toUpperCase()))
                {
                    if(ContextTrace.getCurrentContext() != null)
                    {
                        DefaultLogLevel defaultLogLevel = (DefaultLogLevel) BatchApplicationContext.getDataContainer().get(BatchContextConstans.CMDC_DEFAULT_LOGLEVEL);
                        if(defaultLogLevel != null)
                        {
                            switch (layer) {
                                case SYS:
                                    appLogLevel = defaultLogLevel.getSysLogLevel();
                                    break;
                                case BIZ:
                                    appLogLevel = defaultLogLevel.getBizLogLevel();
                                    break;
                                case DB:
                                    appLogLevel = defaultLogLevel.getDBLogLevel();
                                    break;
                                default:
                                break;
                            }
                        }
                    }
                    else
                    {
                        appLogLevel = null;
                    }
                }
                else
                {
                    appLogLevel = Enum.valueOf(ApplicationLogLevel.class, logLevel.toUpperCase());
                    if(ContextTrace.getCurrentContext() != null)
                    {
                        switch (layer) {
                            case SYS:
                                ((ServiceTraceContextImpl)ContextTrace.getCurrentContext()).setSysLoggingLevel(appLogLevel);
                                break;
                            case BIZ:
                                ((ServiceTraceContextImpl)ContextTrace.getCurrentContext()).setBizLoggingLevel(appLogLevel);
                                break;
                            case DB:
                                ((ServiceTraceContextImpl)ContextTrace.getCurrentContext()).setDBLoggingLevel(appLogLevel);
                                break;
                            default:
                                break;
                        }
                    }
                }
            }
        }
        catch(IllegalArgumentException ie)
        {
            logger.warn("Can not apply registered batch [{}] loglevel. Invalid value [{}]. set default loglevel"
                    , new Object[]{jobId, logLevel}, ie);
        }
        return appLogLevel;
    }

    ...
}

3. 배치데몬정보(BXM_DAEMON_JOB_INFO) 테이블 로드

배치데몬정보 테이블을 로드 하기 위해서 다음과 같은 Interface를 제공하고 있다.

3.1. DaemonControlParameters Interface

배치데몬정보 테이블 로드하기 위한 Interface로서, 배치작업정보(BXM_JOB_INFO)테이블과는 다르게 배치데몬정보 테이블 및 컬럼은 변경할 수 가 없고, 제어하는 컬럼만을 추가하여 커스터마이징을 할 수 있다.

DaemonControlParameters Interface의 구현 Method는 다음과 같다.

public interface BasicBatchControlParameters {
    public void loadBatchControlParameters(String jobId, DataSource datasource);
    public ApplicationLogLevel getSysLogLevel();
    public ApplicationLogLevel getBizLogLevel();
    public ApplicationLogLevel getDBLogLevel();
    public boolean isParamDupExecUseYn();
    public String getCommitCfgList();
    public String getStdDtDscd();
    public String getDtBefAftDscd();
    public int getDtBefAftDayCnt();
}

public interface DaemonControlParameters extends BasicBatchControlParameters {
    public DaemonControlParameters getDaemonControlParameters();

    public String getDomainId();
    public String getJobId();
    public String getJobNm();
    public String getBxmAppId();
    public boolean isUseYn();
    public ApplicationLogLevel getSysLogLevel();
    public ApplicationLogLevel getBizLogLevel();
    public ApplicationLogLevel getDBLogLevel();
    public String getCommitCfgList();
    public String getExecArgs();
    public int getExecIntervalSec();
    public String getCronExecCfgVal();
    public boolean isParllExecYn();
    public boolean isErrStopYn();
    public String getExecStartTime();
    public String getExecEndTime();
}

3.1.1. loadBatchControlParameters() Method

데몬배치정보 테이블(BXM_JOB_DAEMON_INFO)을 조회하여 DaemonControlParameters 객체에 조회한 정보를 설정한다.

loadBatchControlParameters() Method 설명

속성

설명

파라미터

String jobId

배치 실행 시 입력한 Job ID.

DataSource dataSource

배치작업정보 테이블을 조회 처리하기 위한 DataSource.

리턴

void

3.1.2. getDaemonControlParameters() Method

데몬배치정보 테이블(BXM_JOB_DAEMON_INFO)에서 조회한 데몬배치작업정보를 담고 있는 BatchControlParameters Object를 return 한다.

3.1.3. 데몬배치정보 Getter Method

데몬배치정보 테이블(BXM_JOB_DAEMON_INFO)의 거래 제어 항목을 Getting 하기 위한 Method이다.

데몬배치정보 Getter Method 설명
Method 반환값 설명

getDomainId()

String

도메인ID

getJobId()

String

데몬배치작업(Job)ID

getJobName()

String

데몬배치작업명

getBxmAppId()

String

배치의 Application Id

isUseYn()

boolean

데몬배치 사용 여부

getSysLogLevel()

ApplicationLogLevel

시스템 로그레벨

getBizLogLevel()

ApplicationLogLevel

업무 로그레벨

getDBLogLevel()

ApplicationLogLevel

DB 로그레벨

getCommitCfgList()

String

데몬배치 Step의 Commit Interval

getExecArgs()

String

데몬배치 실행 아규먼트

getExecIntervalSec()

int

데몬배치 실행 주기

getCronExecCfgVal()

String

데몬배치 Cron 설정 값

isParllExecYn()

boolean

데몬배치 동시 실행 가능여부

isErrStopYn()

boolean

에러 발생 시 중지여부

getStdDtDscd()

String

기준일자 구분코드

getDtBefAftDscd

String

일자 전후 구분코드

getDtBefAftDayCnt

String

일자 전후 일수

getExecStartTime

String

실행 시작 시간

getExecEndTime

String

실행 종료 시간

3.2. Sample Source

자세한 Source Sample은 bxm-batch-default-extension 프로젝트의 DefaultDaemonControlParameter.java 를 참고한다.

public class DefaultDaemonControlParameter implements DaemonControlParameters{

    private DaemonControlParameters daemonControlParameters;

    private DaemonBatchControlParameterDto daemonBatchParamInfo;

    private boolean useYn;
    private ApplicationLogLevel sysLogLevel;
    private ApplicationLogLevel bizLogLevel;
    private ApplicationLogLevel dbLogLevel;
    private boolean parllExecYn;
    private boolean errStopYn;
    private List<String> dataSourceAllowList;
    private Integer defaultCommitInterval;

    ......

    @Override
    public void loadBatchControlParameters(String jobId) {

        try
        {
            BatchControlMapper batchControlMapper = JdbcOperatorUtils.getMapper(BatchControlMapper.class);
            DaemonBatchControlParameterDto paramInfo =
                    batchControlMapper.selectBxmDaemonBatchJobInfo(BatchApplicationContext.getDomainId(), jobId);

            if(paramInfo != null)
            {
                // 사용여부
                if(StringUtils.hasText(paramInfo.getUseYn()))
                {
                    this.useYn = BatchCommYN.valueOf(paramInfo.getUseYn()).getBoolean();
                }

                // system loglevel
                this.sysLogLevel = getLogLevel(jobId, paramInfo.getSysLogLvNm(), Layer.SYS);

                // biz loglevel
                this.bizLogLevel = getLogLevel(jobId, paramInfo.getBizLogLvNm(), Layer.BIZ);

                // db loglevel
                this.dbLogLevel = getLogLevel(jobId, paramInfo.getDbLogLvNm(), Layer.DB);

                if(StringUtils.hasText(paramInfo.getParllExecYn()))
                {
                    this.parllExecYn = BatchCommYN.valueOf(paramInfo.getParllExecYn()).getBoolean();
                }

                // 실행 노드 정보
                if(StringUtils.hasText(paramInfo.getErrStopYn()))
                {
                    this.errStopYn = BatchCommYN.valueOf(paramInfo.getErrStopYn()).getBoolean();
                }

                // 데이타소스허용목록
                if(StringUtils.hasText(paramInfo.getDsAllwList()))
                {
                    String[] dslist = paramInfo.getDsAllwList().split("\\,");;
                    this.dataSourceAllowList = Arrays.asList(dslist);
                }

                if(StringUtils.hasText(paramInfo.getDefaultCommitIntvl()))
                {
                    this.defaultCommitInterval = Integer.parseInt(paramInfo.getDefaultCommitIntvl());
                }

                daemonControlParameters = this;

                paramInfo.setDomainId(BatchApplicationContext.getDomainId());
                paramInfo.setJobId(jobId);

                this.daemonBatchParamInfo = paramInfo;
            }
            else
            {
                throw new BatchJobNotFoundException(BatchApplicationContext.getDomainId(), jobId);
            }
        }
        catch(Throwable th)
        {
            logger.warn("load batch control parameters for [{}]is failed.", new Object[]{jobId, th});
            throw new IllegalArgumentException(th.getMessage(), th);
        }
    }

    @Override
    public DaemonControlParameters getDaemonControlParameters()
    {
        return daemonControlParameters;
    }

    /**
     * 로그레벨 설정
     * @param jobId 배치 JOB ID
     * @param logLevel 로그레빌(String)
     */
    private ApplicationLogLevel getLogLevel(String jobId, String logLevel, LoggerLayer.Layer layer)
    {
        ApplicationLogLevel appLogLevel = null;
        try
        {
            // 로그레벨 설정
            if(StringUtils.hasText(logLevel))
            {
                // 온디맨드 배치에서는 context가 생성되기 전이기 때문에 파라미터로 넘겨 JobLauncer에서 생성하여 처리하도록 한다.
                if(BxmBatchConstants.BATCH_DEFAULT_LOG_LEVEL.equals(logLevel.toUpperCase()))
                {
                    if(ContextTrace.getCurrentContext() != null)
                    {
                        DefaultLogLevel defaultLogLevel = (DefaultLogLevel) BatchApplicationContext.getDataContainer().get(BatchContextConstans.CMDC_DEFAULT_LOGLEVEL);
                        if(defaultLogLevel != null)
                        {
                            switch (layer) {
                                case SYS:
                                    appLogLevel = defaultLogLevel.getSysLogLevel();
                                    break;
                                case BIZ:
                                    appLogLevel = defaultLogLevel.getBizLogLevel();
                                    break;
                                case DB:
                                    appLogLevel = defaultLogLevel.getDBLogLevel();
                                    break;
                                default:
                                break;
                            }
                        }
                    }
                    else
                    {
                        appLogLevel = null;
                    }
                }
                else
                {
                    appLogLevel = Enum.valueOf(ApplicationLogLevel.class, logLevel.toUpperCase());
                    if(ContextTrace.getCurrentContext() != null)
                    {
                        switch (layer) {
                            case SYS:
                                ((ServiceTraceContextImpl)ContextTrace.getCurrentContext()).setSysLoggingLevel(appLogLevel);
                                break;
                            case BIZ:
                                ((ServiceTraceContextImpl)ContextTrace.getCurrentContext()).setBizLoggingLevel(appLogLevel);
                                break;
                            case DB:
                                ((ServiceTraceContextImpl)ContextTrace.getCurrentContext()).setDBLoggingLevel(appLogLevel);
                                break;
                            default:
                                break;
                        }
                    }
                }
            }
        }
        catch(IllegalArgumentException ie)
        {
            logger.warn("Can not apply registered batch [{}] loglevel. Invalid value [{}]. set default loglevel"
                    , new Object[]{jobId, logLevel}, ie);
        }

        return appLogLevel;
    }
}

4. 적용 방법

만일 배치작업제어와 관련하여 커스터마이징을 모듈을 개발하였다면 해당 모듈을 배치 Instance Configuration 파일(예:bxm-batch.xml)의 batch-context에 적용할 수 있다.

    ...
    <batch-context>
        <batch-control-param classname="bxm.batch.dft.control.DefaultBatchControlParameter"/>
        <daemon-control-param classname="bxm.batch.dft.control.DefaultDaemonControlParameter"/>
    </batch-context>
    ...

Copyright© Bankwareglobal All Rights Reserved.