From 891d46ac23870206337943835b5cddf625332f1f Mon Sep 17 00:00:00 2001 From: HYOJIN Date: Mon, 23 Mar 2026 10:57:37 +0900 Subject: [PATCH] =?UTF-8?q?refactor(batch):=2013=EA=B0=9C=20Job=20Config?= =?UTF-8?q?=EC=9D=98=20=EC=9D=B8=EB=9D=BC=EC=9D=B8=20LastExecutionUpdateTa?= =?UTF-8?q?sklet=EC=9D=84=20=EA=B3=B5=ED=86=B5=20=EB=AA=A8=EB=93=88?= =?UTF-8?q?=EB=A1=9C=20=EA=B5=90=EC=B2=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit movement(8개), risk, psc, event, compliance(2개) Job Config에서 중복된 인라인 Tasklet 람다를 LastExecutionUpdateTasklet 공통 클래스로 교체 Closes #74 Co-Authored-By: Claude Opus 4.6 (1M context) --- ...CompanyComplianceImportRangeJobConfig.java | 34 ++---------------- .../ComplianceImportRangeJobConfig.java | 34 ++---------------- .../batch/config/EventImportJobConfig.java | 36 ++----------------- .../config/AnchorageCallsRangeJobConfig.java | 35 ++---------------- .../batch/config/BerthCallsRangJobConfig.java | 35 ++---------------- .../config/CurrentlyAtRangeJobConfig.java | 35 ++---------------- .../config/DestinationsRangeJobConfig.java | 35 ++---------------- .../config/ShipPortCallsRangeJobConfig.java | 35 ++---------------- .../config/StsOperationRangeJobConfig.java | 35 ++---------------- .../config/TerminalCallsRangeJobConfig.java | 35 ++---------------- .../batch/config/TransitsRangeJobConfig.java | 35 ++---------------- .../batch/config/PscInspectionJobConfig.java | 36 ++----------------- .../config/RiskImportRangeJobConfig.java | 36 ++----------------- 13 files changed, 26 insertions(+), 430 deletions(-) diff --git a/src/main/java/com/snp/batch/jobs/compliance/batch/config/CompanyComplianceImportRangeJobConfig.java b/src/main/java/com/snp/batch/jobs/compliance/batch/config/CompanyComplianceImportRangeJobConfig.java index 329a683..a4ce742 100644 --- a/src/main/java/com/snp/batch/jobs/compliance/batch/config/CompanyComplianceImportRangeJobConfig.java +++ b/src/main/java/com/snp/batch/jobs/compliance/batch/config/CompanyComplianceImportRangeJobConfig.java @@ -1,6 +1,7 @@ package com.snp.batch.jobs.compliance.batch.config; import com.snp.batch.common.batch.config.BaseMultiStepJobConfig; +import com.snp.batch.common.batch.tasklet.LastExecutionUpdateTasklet; import com.snp.batch.jobs.compliance.batch.dto.CompanyComplianceDto; import com.snp.batch.jobs.compliance.batch.entity.CompanyComplianceEntity; import com.snp.batch.jobs.compliance.batch.processor.CompanyComplianceDataProcessor; @@ -30,8 +31,6 @@ import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.web.reactive.function.client.WebClient; -import java.sql.Timestamp; -import java.time.LocalDateTime; import java.time.OffsetDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; @@ -211,36 +210,7 @@ public class CompanyComplianceImportRangeJobConfig extends BaseMultiStepJobConfi */ @Bean public Tasklet companyComplianceLastExecutionUpdateTasklet() { - return (contribution, chunkContext) -> { - String executionMode = chunkContext.getStepContext() - .getStepExecution().getJobExecution() - .getJobParameters().getString("executionMode", "NORMAL"); - if ("RECOLLECT".equals(executionMode)) { - log.info(">>>>> RECOLLECT 모드 - LAST_EXECUTION 업데이트 스킵"); - return RepeatStatus.FINISHED; - } - - String toDateStr = chunkContext.getStepContext() - .getStepExecution().getJobExecution() - .getExecutionContext().getString("batchToDate", null); - - LocalDateTime successDate; - if (toDateStr != null) { - successDate = LocalDateTime.parse(toDateStr).minusHours(lastExecutionBufferHours); - log.info(">>>>> BATCH_LAST_EXECUTION 업데이트 시작 (캡처된 toDate - {}시간 버퍼: {})", lastExecutionBufferHours, successDate); - } else { - successDate = LocalDateTime.now().minusHours(lastExecutionBufferHours); - log.warn(">>>>> batchToDate가 없어 현재 시간 - {}시간 버퍼 사용: {}", lastExecutionBufferHours, successDate); - } - - jdbcTemplate.update( - String.format("UPDATE %s.BATCH_LAST_EXECUTION SET LAST_SUCCESS_DATE = ?, UPDATED_AT = NOW() WHERE API_KEY = ?", targetSchema), - Timestamp.valueOf(successDate), getApiKey() - ); - - log.info(">>>>> BATCH_LAST_EXECUTION 업데이트 완료 (LAST_SUCCESS_DATE = {})", successDate); - return RepeatStatus.FINISHED; - }; + return new LastExecutionUpdateTasklet(jdbcTemplate, targetSchema, getApiKey(), lastExecutionBufferHours); } @Bean(name = "CompanyComplianceLastExecutionUpdateStep") public Step companyComplianceLastExecutionUpdateStep() { diff --git a/src/main/java/com/snp/batch/jobs/compliance/batch/config/ComplianceImportRangeJobConfig.java b/src/main/java/com/snp/batch/jobs/compliance/batch/config/ComplianceImportRangeJobConfig.java index d4a9444..fa496d2 100644 --- a/src/main/java/com/snp/batch/jobs/compliance/batch/config/ComplianceImportRangeJobConfig.java +++ b/src/main/java/com/snp/batch/jobs/compliance/batch/config/ComplianceImportRangeJobConfig.java @@ -1,6 +1,7 @@ package com.snp.batch.jobs.compliance.batch.config; import com.snp.batch.common.batch.config.BaseMultiStepJobConfig; +import com.snp.batch.common.batch.tasklet.LastExecutionUpdateTasklet; import com.snp.batch.jobs.compliance.batch.dto.ComplianceDto; import com.snp.batch.jobs.compliance.batch.entity.ComplianceEntity; import com.snp.batch.jobs.compliance.batch.processor.ComplianceDataProcessor; @@ -30,8 +31,6 @@ import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.web.reactive.function.client.WebClient; -import java.sql.Timestamp; -import java.time.LocalDateTime; import java.time.OffsetDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; @@ -213,36 +212,7 @@ public class ComplianceImportRangeJobConfig extends BaseMultiStepJobConfig { - String executionMode = chunkContext.getStepContext() - .getStepExecution().getJobExecution() - .getJobParameters().getString("executionMode", "NORMAL"); - if ("RECOLLECT".equals(executionMode)) { - log.info(">>>>> RECOLLECT 모드 - LAST_EXECUTION 업데이트 스킵"); - return RepeatStatus.FINISHED; - } - - String toDateStr = chunkContext.getStepContext() - .getStepExecution().getJobExecution() - .getExecutionContext().getString("batchToDate", null); - - LocalDateTime successDate; - if (toDateStr != null) { - successDate = LocalDateTime.parse(toDateStr).minusHours(lastExecutionBufferHours); - log.info(">>>>> BATCH_LAST_EXECUTION 업데이트 시작 (캡처된 toDate - {}시간 버퍼: {})", lastExecutionBufferHours, successDate); - } else { - successDate = LocalDateTime.now().minusHours(lastExecutionBufferHours); - log.warn(">>>>> batchToDate가 없어 현재 시간 - {}시간 버퍼 사용: {}", lastExecutionBufferHours, successDate); - } - - jdbcTemplate.update( - String.format("UPDATE %s.BATCH_LAST_EXECUTION SET LAST_SUCCESS_DATE = ?, UPDATED_AT = NOW() WHERE API_KEY = ?", targetSchema), - Timestamp.valueOf(successDate), getApiKey() - ); - - log.info(">>>>> BATCH_LAST_EXECUTION 업데이트 완료 (LAST_SUCCESS_DATE = {})", successDate); - return RepeatStatus.FINISHED; - }; + return new LastExecutionUpdateTasklet(jdbcTemplate, targetSchema, getApiKey(), lastExecutionBufferHours); } @Bean(name = "ComplianceLastExecutionUpdateStep") public Step complianceLastExecutionUpdateStep() { diff --git a/src/main/java/com/snp/batch/jobs/event/batch/config/EventImportJobConfig.java b/src/main/java/com/snp/batch/jobs/event/batch/config/EventImportJobConfig.java index e31900f..d7dd1c8 100644 --- a/src/main/java/com/snp/batch/jobs/event/batch/config/EventImportJobConfig.java +++ b/src/main/java/com/snp/batch/jobs/event/batch/config/EventImportJobConfig.java @@ -1,6 +1,7 @@ package com.snp.batch.jobs.event.batch.config; import com.snp.batch.common.batch.config.BaseMultiStepJobConfig; +import com.snp.batch.common.batch.tasklet.LastExecutionUpdateTasklet; import com.snp.batch.jobs.event.batch.dto.EventDetailDto; import com.snp.batch.jobs.event.batch.entity.EventDetailEntity; import com.snp.batch.jobs.event.batch.processor.EventDataProcessor; @@ -21,7 +22,6 @@ import org.springframework.batch.core.step.tasklet.Tasklet; import org.springframework.batch.item.ItemProcessor; import org.springframework.batch.item.ItemReader; import org.springframework.batch.item.ItemWriter; -import org.springframework.batch.repeat.RepeatStatus; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; @@ -30,9 +30,6 @@ import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.web.reactive.function.client.WebClient; -import java.sql.Timestamp; -import java.time.LocalDateTime; - @Slf4j @Configuration public class EventImportJobConfig extends BaseMultiStepJobConfig { @@ -159,36 +156,7 @@ public class EventImportJobConfig extends BaseMultiStepJobConfig { - String executionMode = chunkContext.getStepContext() - .getStepExecution().getJobExecution() - .getJobParameters().getString("executionMode", "NORMAL"); - if ("RECOLLECT".equals(executionMode)) { - log.info(">>>>> RECOLLECT 모드 - LAST_EXECUTION 업데이트 스킵"); - return RepeatStatus.FINISHED; - } - - String toDateStr = chunkContext.getStepContext() - .getStepExecution().getJobExecution() - .getExecutionContext().getString("batchToDate", null); - - LocalDateTime successDate; - if (toDateStr != null) { - successDate = LocalDateTime.parse(toDateStr).minusHours(lastExecutionBufferHours); - log.info(">>>>> BATCH_LAST_EXECUTION 업데이트 시작 (캡처된 toDate - {}시간 버퍼: {})", lastExecutionBufferHours, successDate); - } else { - successDate = LocalDateTime.now().minusHours(lastExecutionBufferHours); - log.warn(">>>>> batchToDate가 없어 현재 시간 - {}시간 버퍼 사용: {}", lastExecutionBufferHours, successDate); - } - - jdbcTemplate.update( - String.format("UPDATE %s.BATCH_LAST_EXECUTION SET LAST_SUCCESS_DATE = ?, UPDATED_AT = NOW() WHERE API_KEY = ?", targetSchema), - Timestamp.valueOf(successDate), getApiKey() - ); - - log.info(">>>>> BATCH_LAST_EXECUTION 업데이트 완료 (LAST_SUCCESS_DATE = {})", successDate); - return RepeatStatus.FINISHED; - }; + return new LastExecutionUpdateTasklet(jdbcTemplate, targetSchema, getApiKey(), lastExecutionBufferHours); } @Bean(name = "EventLastExecutionUpdateStep") public Step eventLastExecutionUpdateStep() { diff --git a/src/main/java/com/snp/batch/jobs/movement/batch/config/AnchorageCallsRangeJobConfig.java b/src/main/java/com/snp/batch/jobs/movement/batch/config/AnchorageCallsRangeJobConfig.java index 60ea633..55f5605 100644 --- a/src/main/java/com/snp/batch/jobs/movement/batch/config/AnchorageCallsRangeJobConfig.java +++ b/src/main/java/com/snp/batch/jobs/movement/batch/config/AnchorageCallsRangeJobConfig.java @@ -2,6 +2,7 @@ package com.snp.batch.jobs.movement.batch.config; import com.fasterxml.jackson.databind.ObjectMapper; import com.snp.batch.common.batch.config.BaseMultiStepJobConfig; +import com.snp.batch.common.batch.tasklet.LastExecutionUpdateTasklet; import com.snp.batch.jobs.movement.batch.dto.AnchorageCallsDto; import com.snp.batch.jobs.movement.batch.entity.AnchorageCallsEntity; import com.snp.batch.jobs.movement.batch.processor.AnchorageCallsProcessor; @@ -20,7 +21,6 @@ import org.springframework.batch.core.step.tasklet.Tasklet; import org.springframework.batch.item.ItemProcessor; import org.springframework.batch.item.ItemReader; import org.springframework.batch.item.ItemWriter; -import org.springframework.batch.repeat.RepeatStatus; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; @@ -29,8 +29,6 @@ import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.web.reactive.function.client.WebClient; -import java.sql.Timestamp; -import java.time.LocalDateTime; @Slf4j @Configuration @@ -149,36 +147,7 @@ public class AnchorageCallsRangeJobConfig extends BaseMultiStepJobConfig { - String executionMode = chunkContext.getStepContext() - .getStepExecution().getJobExecution() - .getJobParameters().getString("executionMode", "NORMAL"); - if ("RECOLLECT".equals(executionMode)) { - log.info(">>>>> RECOLLECT 모드 - LAST_EXECUTION 업데이트 스킵"); - return RepeatStatus.FINISHED; - } - - String toDateStr = chunkContext.getStepContext() - .getStepExecution().getJobExecution() - .getExecutionContext().getString("batchToDate", null); - - LocalDateTime successDate; - if (toDateStr != null) { - successDate = LocalDateTime.parse(toDateStr); - log.info(">>>>> BATCH_LAST_EXECUTION 업데이트 시작 (캡처된 toDate: {})", successDate); - } else { - successDate = LocalDateTime.now(); - log.warn(">>>>> batchToDate가 없어 현재 시간 사용: {}", successDate); - } - - jdbcTemplate.update( - String.format("UPDATE %s.BATCH_LAST_EXECUTION SET LAST_SUCCESS_DATE = ?, UPDATED_AT = NOW() WHERE API_KEY = ?", targetSchema), - Timestamp.valueOf(successDate), getApiKey() - ); - - log.info(">>>>> BATCH_LAST_EXECUTION 업데이트 완료 (LAST_SUCCESS_DATE = {})", successDate); - return RepeatStatus.FINISHED; - }; + return new LastExecutionUpdateTasklet(jdbcTemplate, targetSchema, getApiKey(), 0); } @Bean(name = "AnchorageCallsLastExecutionUpdateStep") public Step anchorageCallsLastExecutionUpdateStep() { diff --git a/src/main/java/com/snp/batch/jobs/movement/batch/config/BerthCallsRangJobConfig.java b/src/main/java/com/snp/batch/jobs/movement/batch/config/BerthCallsRangJobConfig.java index dc705b1..e2c99cc 100644 --- a/src/main/java/com/snp/batch/jobs/movement/batch/config/BerthCallsRangJobConfig.java +++ b/src/main/java/com/snp/batch/jobs/movement/batch/config/BerthCallsRangJobConfig.java @@ -2,6 +2,7 @@ package com.snp.batch.jobs.movement.batch.config; import com.fasterxml.jackson.databind.ObjectMapper; import com.snp.batch.common.batch.config.BaseMultiStepJobConfig; +import com.snp.batch.common.batch.tasklet.LastExecutionUpdateTasklet; import com.snp.batch.jobs.movement.batch.dto.BerthCallsDto; import com.snp.batch.jobs.movement.batch.entity.BerthCallsEntity; import com.snp.batch.jobs.movement.batch.processor.BerthCallsProcessor; @@ -20,7 +21,6 @@ import org.springframework.batch.core.step.tasklet.Tasklet; import org.springframework.batch.item.ItemProcessor; import org.springframework.batch.item.ItemReader; import org.springframework.batch.item.ItemWriter; -import org.springframework.batch.repeat.RepeatStatus; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; @@ -29,8 +29,6 @@ import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.web.reactive.function.client.WebClient; -import java.sql.Timestamp; -import java.time.LocalDateTime; @Slf4j @Configuration @@ -143,36 +141,7 @@ public class BerthCallsRangJobConfig extends BaseMultiStepJobConfig { - String executionMode = chunkContext.getStepContext() - .getStepExecution().getJobExecution() - .getJobParameters().getString("executionMode", "NORMAL"); - if ("RECOLLECT".equals(executionMode)) { - log.info(">>>>> RECOLLECT 모드 - LAST_EXECUTION 업데이트 스킵"); - return RepeatStatus.FINISHED; - } - - String toDateStr = chunkContext.getStepContext() - .getStepExecution().getJobExecution() - .getExecutionContext().getString("batchToDate", null); - - LocalDateTime successDate; - if (toDateStr != null) { - successDate = LocalDateTime.parse(toDateStr); - log.info(">>>>> BATCH_LAST_EXECUTION 업데이트 시작 (캡처된 toDate: {})", successDate); - } else { - successDate = LocalDateTime.now(); - log.warn(">>>>> batchToDate가 없어 현재 시간 사용: {}", successDate); - } - - jdbcTemplate.update( - String.format("UPDATE %s.BATCH_LAST_EXECUTION SET LAST_SUCCESS_DATE = ?, UPDATED_AT = NOW() WHERE API_KEY = ?", targetSchema), - Timestamp.valueOf(successDate), getApiKey() - ); - - log.info(">>>>> BATCH_LAST_EXECUTION 업데이트 완료 (LAST_SUCCESS_DATE = {})", successDate); - return RepeatStatus.FINISHED; - }; + return new LastExecutionUpdateTasklet(jdbcTemplate, targetSchema, getApiKey(), 0); } @Bean(name = "BerthCallsLastExecutionUpdateStep") public Step berthCallsLastExecutionUpdateStep() { diff --git a/src/main/java/com/snp/batch/jobs/movement/batch/config/CurrentlyAtRangeJobConfig.java b/src/main/java/com/snp/batch/jobs/movement/batch/config/CurrentlyAtRangeJobConfig.java index e958995..5bb8621 100644 --- a/src/main/java/com/snp/batch/jobs/movement/batch/config/CurrentlyAtRangeJobConfig.java +++ b/src/main/java/com/snp/batch/jobs/movement/batch/config/CurrentlyAtRangeJobConfig.java @@ -2,6 +2,7 @@ package com.snp.batch.jobs.movement.batch.config; import com.fasterxml.jackson.databind.ObjectMapper; import com.snp.batch.common.batch.config.BaseMultiStepJobConfig; +import com.snp.batch.common.batch.tasklet.LastExecutionUpdateTasklet; import com.snp.batch.jobs.movement.batch.dto.CurrentlyAtDto; import com.snp.batch.jobs.movement.batch.entity.CurrentlyAtEntity; import com.snp.batch.jobs.movement.batch.processor.CurrentlyAtProcessor; @@ -20,7 +21,6 @@ import org.springframework.batch.core.step.tasklet.Tasklet; import org.springframework.batch.item.ItemProcessor; import org.springframework.batch.item.ItemReader; import org.springframework.batch.item.ItemWriter; -import org.springframework.batch.repeat.RepeatStatus; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; @@ -29,8 +29,6 @@ import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.web.reactive.function.client.WebClient; -import java.sql.Timestamp; -import java.time.LocalDateTime; @Slf4j @Configuration @@ -141,36 +139,7 @@ public class CurrentlyAtRangeJobConfig extends BaseMultiStepJobConfig { - String executionMode = chunkContext.getStepContext() - .getStepExecution().getJobExecution() - .getJobParameters().getString("executionMode", "NORMAL"); - if ("RECOLLECT".equals(executionMode)) { - log.info(">>>>> RECOLLECT 모드 - LAST_EXECUTION 업데이트 스킵"); - return RepeatStatus.FINISHED; - } - - String toDateStr = chunkContext.getStepContext() - .getStepExecution().getJobExecution() - .getExecutionContext().getString("batchToDate", null); - - LocalDateTime successDate; - if (toDateStr != null) { - successDate = LocalDateTime.parse(toDateStr); - log.info(">>>>> BATCH_LAST_EXECUTION 업데이트 시작 (캡처된 toDate: {})", successDate); - } else { - successDate = LocalDateTime.now(); - log.warn(">>>>> batchToDate가 없어 현재 시간 사용: {}", successDate); - } - - jdbcTemplate.update( - String.format("UPDATE %s.BATCH_LAST_EXECUTION SET LAST_SUCCESS_DATE = ?, UPDATED_AT = NOW() WHERE API_KEY = ?", targetSchema), - Timestamp.valueOf(successDate), getApiKey() - ); - - log.info(">>>>> BATCH_LAST_EXECUTION 업데이트 완료 (LAST_SUCCESS_DATE = {})", successDate); - return RepeatStatus.FINISHED; - }; + return new LastExecutionUpdateTasklet(jdbcTemplate, targetSchema, getApiKey(), 0); } @Bean(name = "CurrentlyAtLastExecutionUpdateStep") public Step currentlyAtLastExecutionUpdateStep() { diff --git a/src/main/java/com/snp/batch/jobs/movement/batch/config/DestinationsRangeJobConfig.java b/src/main/java/com/snp/batch/jobs/movement/batch/config/DestinationsRangeJobConfig.java index 169d1d1..9aa35ea 100644 --- a/src/main/java/com/snp/batch/jobs/movement/batch/config/DestinationsRangeJobConfig.java +++ b/src/main/java/com/snp/batch/jobs/movement/batch/config/DestinationsRangeJobConfig.java @@ -2,6 +2,7 @@ package com.snp.batch.jobs.movement.batch.config; import com.fasterxml.jackson.databind.ObjectMapper; import com.snp.batch.common.batch.config.BaseMultiStepJobConfig; +import com.snp.batch.common.batch.tasklet.LastExecutionUpdateTasklet; import com.snp.batch.jobs.movement.batch.dto.DestinationDto; import com.snp.batch.jobs.movement.batch.entity.DestinationEntity; import com.snp.batch.jobs.movement.batch.processor.DestinationProcessor; @@ -20,7 +21,6 @@ import org.springframework.batch.core.step.tasklet.Tasklet; import org.springframework.batch.item.ItemProcessor; import org.springframework.batch.item.ItemReader; import org.springframework.batch.item.ItemWriter; -import org.springframework.batch.repeat.RepeatStatus; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; @@ -29,8 +29,6 @@ import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.web.reactive.function.client.WebClient; -import java.sql.Timestamp; -import java.time.LocalDateTime; @Slf4j @Configuration @@ -144,36 +142,7 @@ public class DestinationsRangeJobConfig extends BaseMultiStepJobConfig { - String executionMode = chunkContext.getStepContext() - .getStepExecution().getJobExecution() - .getJobParameters().getString("executionMode", "NORMAL"); - if ("RECOLLECT".equals(executionMode)) { - log.info(">>>>> RECOLLECT 모드 - LAST_EXECUTION 업데이트 스킵"); - return RepeatStatus.FINISHED; - } - - String toDateStr = chunkContext.getStepContext() - .getStepExecution().getJobExecution() - .getExecutionContext().getString("batchToDate", null); - - LocalDateTime successDate; - if (toDateStr != null) { - successDate = LocalDateTime.parse(toDateStr); - log.info(">>>>> BATCH_LAST_EXECUTION 업데이트 시작 (캡처된 toDate: {})", successDate); - } else { - successDate = LocalDateTime.now(); - log.warn(">>>>> batchToDate가 없어 현재 시간 사용: {}", successDate); - } - - jdbcTemplate.update( - String.format("UPDATE %s.BATCH_LAST_EXECUTION SET LAST_SUCCESS_DATE = ?, UPDATED_AT = NOW() WHERE API_KEY = ?", targetSchema), - Timestamp.valueOf(successDate), getApiKey() - ); - - log.info(">>>>> BATCH_LAST_EXECUTION 업데이트 완료 (LAST_SUCCESS_DATE = {})", successDate); - return RepeatStatus.FINISHED; - }; + return new LastExecutionUpdateTasklet(jdbcTemplate, targetSchema, getApiKey(), 0); } @Bean(name = "DestinationsLastExecutionUpdateStep") public Step destinationsLastExecutionUpdateStep() { diff --git a/src/main/java/com/snp/batch/jobs/movement/batch/config/ShipPortCallsRangeJobConfig.java b/src/main/java/com/snp/batch/jobs/movement/batch/config/ShipPortCallsRangeJobConfig.java index d638f27..92ce464 100644 --- a/src/main/java/com/snp/batch/jobs/movement/batch/config/ShipPortCallsRangeJobConfig.java +++ b/src/main/java/com/snp/batch/jobs/movement/batch/config/ShipPortCallsRangeJobConfig.java @@ -2,6 +2,7 @@ package com.snp.batch.jobs.movement.batch.config; import com.fasterxml.jackson.databind.ObjectMapper; import com.snp.batch.common.batch.config.BaseMultiStepJobConfig; +import com.snp.batch.common.batch.tasklet.LastExecutionUpdateTasklet; import com.snp.batch.jobs.movement.batch.dto.PortCallsDto; import com.snp.batch.jobs.movement.batch.entity.PortCallsEntity; import com.snp.batch.jobs.movement.batch.processor.PortCallsProcessor; @@ -20,7 +21,6 @@ import org.springframework.batch.core.step.tasklet.Tasklet; import org.springframework.batch.item.ItemProcessor; import org.springframework.batch.item.ItemReader; import org.springframework.batch.item.ItemWriter; -import org.springframework.batch.repeat.RepeatStatus; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; @@ -29,8 +29,6 @@ import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.web.reactive.function.client.WebClient; -import java.sql.Timestamp; -import java.time.LocalDateTime; @Slf4j @Configuration @@ -145,36 +143,7 @@ public class ShipPortCallsRangeJobConfig extends BaseMultiStepJobConfig { - String executionMode = chunkContext.getStepContext() - .getStepExecution().getJobExecution() - .getJobParameters().getString("executionMode", "NORMAL"); - if ("RECOLLECT".equals(executionMode)) { - log.info(">>>>> RECOLLECT 모드 - LAST_EXECUTION 업데이트 스킵"); - return RepeatStatus.FINISHED; - } - - String toDateStr = chunkContext.getStepContext() - .getStepExecution().getJobExecution() - .getExecutionContext().getString("batchToDate", null); - - LocalDateTime successDate; - if (toDateStr != null) { - successDate = LocalDateTime.parse(toDateStr); - log.info(">>>>> BATCH_LAST_EXECUTION 업데이트 시작 (캡처된 toDate: {})", successDate); - } else { - successDate = LocalDateTime.now(); - log.warn(">>>>> batchToDate가 없어 현재 시간 사용: {}", successDate); - } - - jdbcTemplate.update( - String.format("UPDATE %s.BATCH_LAST_EXECUTION SET LAST_SUCCESS_DATE = ?, UPDATED_AT = NOW() WHERE API_KEY = ?", targetSchema), - Timestamp.valueOf(successDate), getApiKey() - ); - - log.info(">>>>> BATCH_LAST_EXECUTION 업데이트 완료 (LAST_SUCCESS_DATE = {})", successDate); - return RepeatStatus.FINISHED; - }; + return new LastExecutionUpdateTasklet(jdbcTemplate, targetSchema, getApiKey(), 0); } @Bean(name = "PortCallsLastExecutionUpdateStep") public Step portCallsLastExecutionUpdateStep() { diff --git a/src/main/java/com/snp/batch/jobs/movement/batch/config/StsOperationRangeJobConfig.java b/src/main/java/com/snp/batch/jobs/movement/batch/config/StsOperationRangeJobConfig.java index acbbcdb..8b35c2a 100644 --- a/src/main/java/com/snp/batch/jobs/movement/batch/config/StsOperationRangeJobConfig.java +++ b/src/main/java/com/snp/batch/jobs/movement/batch/config/StsOperationRangeJobConfig.java @@ -2,6 +2,7 @@ package com.snp.batch.jobs.movement.batch.config; import com.fasterxml.jackson.databind.ObjectMapper; import com.snp.batch.common.batch.config.BaseMultiStepJobConfig; +import com.snp.batch.common.batch.tasklet.LastExecutionUpdateTasklet; import com.snp.batch.jobs.movement.batch.dto.StsOperationDto; import com.snp.batch.jobs.movement.batch.entity.StsOperationEntity; import com.snp.batch.jobs.movement.batch.processor.StsOperationProcessor; @@ -20,7 +21,6 @@ import org.springframework.batch.core.step.tasklet.Tasklet; import org.springframework.batch.item.ItemProcessor; import org.springframework.batch.item.ItemReader; import org.springframework.batch.item.ItemWriter; -import org.springframework.batch.repeat.RepeatStatus; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; @@ -29,8 +29,6 @@ import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.web.reactive.function.client.WebClient; -import java.sql.Timestamp; -import java.time.LocalDateTime; @Slf4j @Configuration @@ -143,36 +141,7 @@ public class StsOperationRangeJobConfig extends BaseMultiStepJobConfig { - String executionMode = chunkContext.getStepContext() - .getStepExecution().getJobExecution() - .getJobParameters().getString("executionMode", "NORMAL"); - if ("RECOLLECT".equals(executionMode)) { - log.info(">>>>> RECOLLECT 모드 - LAST_EXECUTION 업데이트 스킵"); - return RepeatStatus.FINISHED; - } - - String toDateStr = chunkContext.getStepContext() - .getStepExecution().getJobExecution() - .getExecutionContext().getString("batchToDate", null); - - LocalDateTime successDate; - if (toDateStr != null) { - successDate = LocalDateTime.parse(toDateStr); - log.info(">>>>> BATCH_LAST_EXECUTION 업데이트 시작 (캡처된 toDate: {})", successDate); - } else { - successDate = LocalDateTime.now(); - log.warn(">>>>> batchToDate가 없어 현재 시간 사용: {}", successDate); - } - - jdbcTemplate.update( - String.format("UPDATE %s.BATCH_LAST_EXECUTION SET LAST_SUCCESS_DATE = ?, UPDATED_AT = NOW() WHERE API_KEY = ?", targetSchema), - Timestamp.valueOf(successDate), getApiKey() - ); - - log.info(">>>>> BATCH_LAST_EXECUTION 업데이트 완료 (LAST_SUCCESS_DATE = {})", successDate); - return RepeatStatus.FINISHED; - }; + return new LastExecutionUpdateTasklet(jdbcTemplate, targetSchema, getApiKey(), 0); } @Bean(name = "StsOperationLastExecutionUpdateStep") public Step stsOperationLastExecutionUpdateStep() { diff --git a/src/main/java/com/snp/batch/jobs/movement/batch/config/TerminalCallsRangeJobConfig.java b/src/main/java/com/snp/batch/jobs/movement/batch/config/TerminalCallsRangeJobConfig.java index 1eff291..59f006a 100644 --- a/src/main/java/com/snp/batch/jobs/movement/batch/config/TerminalCallsRangeJobConfig.java +++ b/src/main/java/com/snp/batch/jobs/movement/batch/config/TerminalCallsRangeJobConfig.java @@ -2,6 +2,7 @@ package com.snp.batch.jobs.movement.batch.config; import com.fasterxml.jackson.databind.ObjectMapper; import com.snp.batch.common.batch.config.BaseMultiStepJobConfig; +import com.snp.batch.common.batch.tasklet.LastExecutionUpdateTasklet; import com.snp.batch.jobs.movement.batch.dto.TerminalCallsDto; import com.snp.batch.jobs.movement.batch.entity.TerminalCallsEntity; import com.snp.batch.jobs.movement.batch.processor.TerminalCallsProcessor; @@ -20,7 +21,6 @@ import org.springframework.batch.core.step.tasklet.Tasklet; import org.springframework.batch.item.ItemProcessor; import org.springframework.batch.item.ItemReader; import org.springframework.batch.item.ItemWriter; -import org.springframework.batch.repeat.RepeatStatus; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; @@ -29,8 +29,6 @@ import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.web.reactive.function.client.WebClient; -import java.sql.Timestamp; -import java.time.LocalDateTime; @Slf4j @Configuration @@ -143,36 +141,7 @@ public class TerminalCallsRangeJobConfig extends BaseMultiStepJobConfig { - String executionMode = chunkContext.getStepContext() - .getStepExecution().getJobExecution() - .getJobParameters().getString("executionMode", "NORMAL"); - if ("RECOLLECT".equals(executionMode)) { - log.info(">>>>> RECOLLECT 모드 - LAST_EXECUTION 업데이트 스킵"); - return RepeatStatus.FINISHED; - } - - String toDateStr = chunkContext.getStepContext() - .getStepExecution().getJobExecution() - .getExecutionContext().getString("batchToDate", null); - - LocalDateTime successDate; - if (toDateStr != null) { - successDate = LocalDateTime.parse(toDateStr); - log.info(">>>>> BATCH_LAST_EXECUTION 업데이트 시작 (캡처된 toDate: {})", successDate); - } else { - successDate = LocalDateTime.now(); - log.warn(">>>>> batchToDate가 없어 현재 시간 사용: {}", successDate); - } - - jdbcTemplate.update( - String.format("UPDATE %s.BATCH_LAST_EXECUTION SET LAST_SUCCESS_DATE = ?, UPDATED_AT = NOW() WHERE API_KEY = ?", targetSchema), - Timestamp.valueOf(successDate), getApiKey() - ); - - log.info(">>>>> BATCH_LAST_EXECUTION 업데이트 완료 (LAST_SUCCESS_DATE = {})", successDate); - return RepeatStatus.FINISHED; - }; + return new LastExecutionUpdateTasklet(jdbcTemplate, targetSchema, getApiKey(), 0); } @Bean(name = "TerminalCallsLastExecutionUpdateStep") public Step terminalCallsLastExecutionUpdateStep() { diff --git a/src/main/java/com/snp/batch/jobs/movement/batch/config/TransitsRangeJobConfig.java b/src/main/java/com/snp/batch/jobs/movement/batch/config/TransitsRangeJobConfig.java index 53be31a..de521cd 100644 --- a/src/main/java/com/snp/batch/jobs/movement/batch/config/TransitsRangeJobConfig.java +++ b/src/main/java/com/snp/batch/jobs/movement/batch/config/TransitsRangeJobConfig.java @@ -1,6 +1,7 @@ package com.snp.batch.jobs.movement.batch.config; import com.snp.batch.common.batch.config.BaseMultiStepJobConfig; +import com.snp.batch.common.batch.tasklet.LastExecutionUpdateTasklet; import com.snp.batch.jobs.movement.batch.dto.TransitsDto; import com.snp.batch.jobs.movement.batch.entity.TransitsEntity; import com.snp.batch.jobs.movement.batch.processor.TransitsProcessor; @@ -19,7 +20,6 @@ import org.springframework.batch.core.step.tasklet.Tasklet; import org.springframework.batch.item.ItemProcessor; import org.springframework.batch.item.ItemReader; import org.springframework.batch.item.ItemWriter; -import org.springframework.batch.repeat.RepeatStatus; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; @@ -28,8 +28,6 @@ import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.web.reactive.function.client.WebClient; -import java.sql.Timestamp; -import java.time.LocalDateTime; @Slf4j @Configuration @@ -141,36 +139,7 @@ public class TransitsRangeJobConfig extends BaseMultiStepJobConfig { - String executionMode = chunkContext.getStepContext() - .getStepExecution().getJobExecution() - .getJobParameters().getString("executionMode", "NORMAL"); - if ("RECOLLECT".equals(executionMode)) { - log.info(">>>>> RECOLLECT 모드 - LAST_EXECUTION 업데이트 스킵"); - return RepeatStatus.FINISHED; - } - - String toDateStr = chunkContext.getStepContext() - .getStepExecution().getJobExecution() - .getExecutionContext().getString("batchToDate", null); - - LocalDateTime successDate; - if (toDateStr != null) { - successDate = LocalDateTime.parse(toDateStr); - log.info(">>>>> BATCH_LAST_EXECUTION 업데이트 시작 (캡처된 toDate: {})", successDate); - } else { - successDate = LocalDateTime.now(); - log.warn(">>>>> batchToDate가 없어 현재 시간 사용: {}", successDate); - } - - jdbcTemplate.update( - String.format("UPDATE %s.BATCH_LAST_EXECUTION SET LAST_SUCCESS_DATE = ?, UPDATED_AT = NOW() WHERE API_KEY = ?", targetSchema), - Timestamp.valueOf(successDate), getApiKey() - ); - - log.info(">>>>> BATCH_LAST_EXECUTION 업데이트 완료 (LAST_SUCCESS_DATE = {})", successDate); - return RepeatStatus.FINISHED; - }; + return new LastExecutionUpdateTasklet(jdbcTemplate, targetSchema, getApiKey(), 0); } @Bean(name = "TransitsLastExecutionUpdateStep") public Step transitsLastExecutionUpdateStep() { diff --git a/src/main/java/com/snp/batch/jobs/pscInspection/batch/config/PscInspectionJobConfig.java b/src/main/java/com/snp/batch/jobs/pscInspection/batch/config/PscInspectionJobConfig.java index 1d27a4b..83ea48f 100644 --- a/src/main/java/com/snp/batch/jobs/pscInspection/batch/config/PscInspectionJobConfig.java +++ b/src/main/java/com/snp/batch/jobs/pscInspection/batch/config/PscInspectionJobConfig.java @@ -2,6 +2,7 @@ package com.snp.batch.jobs.pscInspection.batch.config; import com.fasterxml.jackson.databind.ObjectMapper; import com.snp.batch.common.batch.config.BaseMultiStepJobConfig; +import com.snp.batch.common.batch.tasklet.LastExecutionUpdateTasklet; import com.snp.batch.jobs.facility.batch.processor.PortDataProcessor; import com.snp.batch.jobs.pscInspection.batch.dto.PscInspectionDto; import com.snp.batch.jobs.pscInspection.batch.entity.PscInspectionEntity; @@ -23,7 +24,6 @@ import org.springframework.batch.core.step.tasklet.Tasklet; import org.springframework.batch.item.ItemProcessor; import org.springframework.batch.item.ItemReader; import org.springframework.batch.item.ItemWriter; -import org.springframework.batch.repeat.RepeatStatus; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; @@ -32,9 +32,6 @@ import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.web.reactive.function.client.WebClient; -import java.sql.Timestamp; -import java.time.LocalDateTime; - @Slf4j @Configuration public class PscInspectionJobConfig extends BaseMultiStepJobConfig { @@ -165,36 +162,7 @@ public class PscInspectionJobConfig extends BaseMultiStepJobConfig { - String executionMode = chunkContext.getStepContext() - .getStepExecution().getJobExecution() - .getJobParameters().getString("executionMode", "NORMAL"); - if ("RECOLLECT".equals(executionMode)) { - log.info(">>>>> RECOLLECT 모드 - LAST_EXECUTION 업데이트 스킵"); - return RepeatStatus.FINISHED; - } - - String toDateStr = chunkContext.getStepContext() - .getStepExecution().getJobExecution() - .getExecutionContext().getString("batchToDate", null); - - LocalDateTime successDate; - if (toDateStr != null) { - successDate = LocalDateTime.parse(toDateStr).minusHours(lastExecutionBufferHours); - log.info(">>>>> BATCH_LAST_EXECUTION 업데이트 시작 (캡처된 toDate - {}시간 버퍼: {})", lastExecutionBufferHours, successDate); - } else { - successDate = LocalDateTime.now().minusHours(lastExecutionBufferHours); - log.warn(">>>>> batchToDate가 없어 현재 시간 - {}시간 버퍼 사용: {}", lastExecutionBufferHours, successDate); - } - - jdbcTemplate.update( - String.format("UPDATE %s.BATCH_LAST_EXECUTION SET LAST_SUCCESS_DATE = ?, UPDATED_AT = NOW() WHERE API_KEY = ?", targetSchema), - Timestamp.valueOf(successDate), getApiKey() - ); - - log.info(">>>>> BATCH_LAST_EXECUTION 업데이트 완료 (LAST_SUCCESS_DATE = {})", successDate); - return RepeatStatus.FINISHED; - }; + return new LastExecutionUpdateTasklet(jdbcTemplate, targetSchema, getApiKey(), lastExecutionBufferHours); } @Bean(name = "PSCLastExecutionUpdateStep") public Step pscLastExecutionUpdateStep() { diff --git a/src/main/java/com/snp/batch/jobs/risk/batch/config/RiskImportRangeJobConfig.java b/src/main/java/com/snp/batch/jobs/risk/batch/config/RiskImportRangeJobConfig.java index e2e2d37..25f90d0 100644 --- a/src/main/java/com/snp/batch/jobs/risk/batch/config/RiskImportRangeJobConfig.java +++ b/src/main/java/com/snp/batch/jobs/risk/batch/config/RiskImportRangeJobConfig.java @@ -1,6 +1,7 @@ package com.snp.batch.jobs.risk.batch.config; import com.snp.batch.common.batch.config.BaseMultiStepJobConfig; +import com.snp.batch.common.batch.tasklet.LastExecutionUpdateTasklet; import com.snp.batch.jobs.risk.batch.dto.RiskDto; import com.snp.batch.jobs.risk.batch.entity.RiskEntity; import com.snp.batch.jobs.risk.batch.processor.RiskDataProcessor; @@ -21,7 +22,6 @@ import org.springframework.batch.core.step.tasklet.Tasklet; import org.springframework.batch.item.ItemProcessor; import org.springframework.batch.item.ItemReader; import org.springframework.batch.item.ItemWriter; -import org.springframework.batch.repeat.RepeatStatus; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; @@ -30,9 +30,6 @@ import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.web.reactive.function.client.WebClient; -import java.sql.Timestamp; -import java.time.LocalDateTime; - @Slf4j @Configuration public class RiskImportRangeJobConfig extends BaseMultiStepJobConfig { @@ -157,36 +154,7 @@ public class RiskImportRangeJobConfig extends BaseMultiStepJobConfig { - String executionMode = chunkContext.getStepContext() - .getStepExecution().getJobExecution() - .getJobParameters().getString("executionMode", "NORMAL"); - if ("RECOLLECT".equals(executionMode)) { - log.info(">>>>> RECOLLECT 모드 - LAST_EXECUTION 업데이트 스킵"); - return RepeatStatus.FINISHED; - } - - String toDateStr = chunkContext.getStepContext() - .getStepExecution().getJobExecution() - .getExecutionContext().getString("batchToDate", null); - - LocalDateTime successDate; - if (toDateStr != null) { - successDate = LocalDateTime.parse(toDateStr).minusHours(lastExecutionBufferHours); - log.info(">>>>> BATCH_LAST_EXECUTION 업데이트 시작 (캡처된 toDate - {}시간 버퍼: {})", lastExecutionBufferHours, successDate); - } else { - successDate = LocalDateTime.now().minusHours(lastExecutionBufferHours); - log.warn(">>>>> batchToDate가 없어 현재 시간 - {}시간 버퍼 사용: {}", lastExecutionBufferHours, successDate); - } - - jdbcTemplate.update( - String.format("UPDATE %s.BATCH_LAST_EXECUTION SET LAST_SUCCESS_DATE = ?, UPDATED_AT = NOW() WHERE API_KEY = ?", targetSchema), - Timestamp.valueOf(successDate), getApiKey() - ); - - log.info(">>>>> BATCH_LAST_EXECUTION 업데이트 완료 (LAST_SUCCESS_DATE = {})", successDate); - return RepeatStatus.FINISHED; - }; + return new LastExecutionUpdateTasklet(jdbcTemplate, targetSchema, getApiKey(), lastExecutionBufferHours); } @Bean(name = "RiskLastExecutionUpdateStep") public Step riskLastExecutionUpdateStep() {