diff --git a/bitgouel-batch/build.gradle.kts b/bitgouel-batch/build.gradle.kts index bf015e139..9d35e47cd 100644 --- a/bitgouel-batch/build.gradle.kts +++ b/bitgouel-batch/build.gradle.kts @@ -1,8 +1,10 @@ +import org.springframework.boot.gradle.tasks.bundling.BootJar +val jar: Jar by tasks +val bootJar: BootJar by tasks -plugins { - -} +jar.enabled = true +bootJar.enabled = true dependencies { implementation(project(":bitgouel-domain")) diff --git a/bitgouel-batch/src/main/kotlin/team/msg/BatchApplication.kt b/bitgouel-batch/src/main/kotlin/team/msg/BatchApplication.kt new file mode 100644 index 000000000..cceb79918 --- /dev/null +++ b/bitgouel-batch/src/main/kotlin/team/msg/BatchApplication.kt @@ -0,0 +1,16 @@ +package team.msg + +import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing +import org.springframework.boot.SpringApplication +import org.springframework.boot.autoconfigure.SpringBootApplication +import org.springframework.boot.runApplication +import kotlin.system.exitProcess + +@SpringBootApplication +@EnableBatchProcessing +class BatchApplication + +fun main(args: Array) { + val applicationContext = runApplication(*args) + exitProcess(SpringApplication.exit(applicationContext)) // 배치 완료 후 바로 process 종료 +} diff --git a/bitgouel-batch/src/main/kotlin/team/msg/common/BaseJobParameter.kt b/bitgouel-batch/src/main/kotlin/team/msg/common/BaseJobParameter.kt new file mode 100644 index 000000000..c25166b3e --- /dev/null +++ b/bitgouel-batch/src/main/kotlin/team/msg/common/BaseJobParameter.kt @@ -0,0 +1,7 @@ +package team.msg.common + +/** + * 개발/QA 도중에 같은 Job 파라미터 값으로 배치 실행이 가능하도록 version을 지정합니다. + * version은 1부터 시작합니다. + */ +open class BaseJobParameter(val version: Int) \ No newline at end of file diff --git a/bitgouel-batch/src/main/resources/application.yml b/bitgouel-batch/src/main/resources/application.yml new file mode 100644 index 000000000..0ecb73a99 --- /dev/null +++ b/bitgouel-batch/src/main/resources/application.yml @@ -0,0 +1,11 @@ +spring: + datasource: + hikari: + jdbc-url: jdbc:mysql://${DB_URL:localhost:3306}/${DB_NAME:bitgouel}?useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Seoul&allowPublicKeyRetrieval=true + username: ${DB_USER:bitgouel-admin} + password: ${DB_PASSWORD:Esperer123!} + driver-class-name: com.mysql.cj.jdbc.Driver + + batch: + job: + enabled: false \ No newline at end of file diff --git a/bitgouel-batch/src/main/resources/schema.sql b/bitgouel-batch/src/main/resources/schema.sql new file mode 100644 index 000000000..3378a9a75 --- /dev/null +++ b/bitgouel-batch/src/main/resources/schema.sql @@ -0,0 +1,101 @@ +-- Autogenerated: do not edit this file + +CREATE TABLE BATCH_JOB_INSTANCE ( + JOB_INSTANCE_ID BIGINT NOT NULL PRIMARY KEY , + VERSION BIGINT , + JOB_NAME VARCHAR(100) NOT NULL, + JOB_KEY VARCHAR(32) NOT NULL, + constraint JOB_INST_UN unique (JOB_NAME, JOB_KEY) +) ENGINE=InnoDB; + +CREATE TABLE BATCH_JOB_EXECUTION ( + JOB_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY , + VERSION BIGINT , + JOB_INSTANCE_ID BIGINT NOT NULL, + CREATE_TIME DATETIME(6) NOT NULL, + START_TIME DATETIME(6) DEFAULT NULL , + END_TIME DATETIME(6) DEFAULT NULL , + STATUS VARCHAR(10) , + EXIT_CODE VARCHAR(2500) , + EXIT_MESSAGE VARCHAR(2500) , + LAST_UPDATED DATETIME(6), + JOB_CONFIGURATION_LOCATION VARCHAR(2500) NULL, + constraint JOB_INST_EXEC_FK foreign key (JOB_INSTANCE_ID) + references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID) +) ENGINE=InnoDB; + +CREATE TABLE BATCH_JOB_EXECUTION_PARAMS ( + JOB_EXECUTION_ID BIGINT NOT NULL , + TYPE_CD VARCHAR(6) NOT NULL , + KEY_NAME VARCHAR(100) NOT NULL , + STRING_VAL VARCHAR(250) , + DATE_VAL DATETIME(6) DEFAULT NULL , + LONG_VAL BIGINT , + DOUBLE_VAL DOUBLE PRECISION , + IDENTIFYING CHAR(1) NOT NULL , + constraint JOB_EXEC_PARAMS_FK foreign key (JOB_EXECUTION_ID) + references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) +) ENGINE=InnoDB; + +CREATE TABLE BATCH_STEP_EXECUTION ( + STEP_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY , + VERSION BIGINT NOT NULL, + STEP_NAME VARCHAR(100) NOT NULL, + JOB_EXECUTION_ID BIGINT NOT NULL, + START_TIME DATETIME(6) NOT NULL , + END_TIME DATETIME(6) DEFAULT NULL , + STATUS VARCHAR(10) , + COMMIT_COUNT BIGINT , + READ_COUNT BIGINT , + FILTER_COUNT BIGINT , + WRITE_COUNT BIGINT , + READ_SKIP_COUNT BIGINT , + WRITE_SKIP_COUNT BIGINT , + PROCESS_SKIP_COUNT BIGINT , + ROLLBACK_COUNT BIGINT , + EXIT_CODE VARCHAR(2500) , + EXIT_MESSAGE VARCHAR(2500) , + LAST_UPDATED DATETIME(6), + constraint JOB_EXEC_STEP_FK foreign key (JOB_EXECUTION_ID) + references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) +) ENGINE=InnoDB; + +CREATE TABLE BATCH_STEP_EXECUTION_CONTEXT ( + STEP_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, + SHORT_CONTEXT VARCHAR(2500) NOT NULL, + SERIALIZED_CONTEXT TEXT , + constraint STEP_EXEC_CTX_FK foreign key (STEP_EXECUTION_ID) + references BATCH_STEP_EXECUTION(STEP_EXECUTION_ID) +) ENGINE=InnoDB; + +CREATE TABLE BATCH_JOB_EXECUTION_CONTEXT ( + JOB_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, + SHORT_CONTEXT VARCHAR(2500) NOT NULL, + SERIALIZED_CONTEXT TEXT , + constraint JOB_EXEC_CTX_FK foreign key (JOB_EXECUTION_ID) + references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) +) ENGINE=InnoDB; + +CREATE TABLE BATCH_STEP_EXECUTION_SEQ ( + ID BIGINT NOT NULL, + UNIQUE_KEY CHAR(1) NOT NULL, + constraint UNIQUE_KEY_UN unique (UNIQUE_KEY) +) ENGINE=InnoDB; + +INSERT INTO BATCH_STEP_EXECUTION_SEQ (ID, UNIQUE_KEY) select * from (select 0 as ID, '0' as UNIQUE_KEY) as tmp where not exists(select * from BATCH_STEP_EXECUTION_SEQ); + +CREATE TABLE BATCH_JOB_EXECUTION_SEQ ( + ID BIGINT NOT NULL, + UNIQUE_KEY CHAR(1) NOT NULL, + constraint UNIQUE_KEY_UN unique (UNIQUE_KEY) +) ENGINE=InnoDB; + +INSERT INTO BATCH_JOB_EXECUTION_SEQ (ID, UNIQUE_KEY) select * from (select 0 as ID, '0' as UNIQUE_KEY) as tmp where not exists(select * from BATCH_JOB_EXECUTION_SEQ); + +CREATE TABLE BATCH_JOB_SEQ ( + ID BIGINT NOT NULL, + UNIQUE_KEY CHAR(1) NOT NULL, + constraint UNIQUE_KEY_UN unique (UNIQUE_KEY) +) ENGINE=InnoDB; + +INSERT INTO BATCH_JOB_SEQ (ID, UNIQUE_KEY) select * from (select 0 as ID, '0' as UNIQUE_KEY) as tmp where not exists(select * from BATCH_JOB_SEQ); diff --git a/bitgouel-domain/src/main/kotlin/common/LoggerDelegator.kt b/bitgouel-domain/src/main/kotlin/common/LoggerDelegator.kt new file mode 100644 index 000000000..bbe0250d0 --- /dev/null +++ b/bitgouel-domain/src/main/kotlin/common/LoggerDelegator.kt @@ -0,0 +1,9 @@ +package common + +import org.slf4j.LoggerFactory +import java.util.logging.Logger + +class LoggerDelegator { + private var logger: Logger? = null + operator fun getValue(thisRef: Any?, property: Any?) = logger ?: LoggerFactory.getLogger(thisRef?.javaClass)!! +} \ No newline at end of file