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 abae783..c0d5958 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 @@ -30,6 +30,8 @@ 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; @@ -56,11 +58,6 @@ public class CompanyComplianceImportRangeJobConfig extends BaseMultiStepJobConfi private int lastExecutionBufferHours; protected String getApiKey() {return "COMPANY_COMPLIANCE_IMPORT_API";} - protected String getBatchUpdateSql() { - return String.format( - "UPDATE %s.BATCH_LAST_EXECUTION SET LAST_SUCCESS_DATE = NOW() - INTERVAL '%d HOURS', UPDATED_AT = NOW() WHERE API_KEY = '%s'", - targetSchema, lastExecutionBufferHours, getApiKey()); - } @Override protected int getChunkSize() { @@ -215,11 +212,25 @@ public class CompanyComplianceImportRangeJobConfig extends BaseMultiStepJobConfi @Bean public Tasklet companyComplianceLastExecutionUpdateTasklet() { return (contribution, chunkContext) -> { - log.info(">>>>> 모든 스텝 성공: BATCH_LAST_EXECUTION 업데이트 시작 (버퍼: {}시간)", lastExecutionBufferHours); + String toDateStr = chunkContext.getStepContext() + .getStepExecution().getJobExecution() + .getExecutionContext().getString("batchToDate", null); - jdbcTemplate.execute(getBatchUpdateSql()); + 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); + } - log.info(">>>>> BATCH_LAST_EXECUTION 업데이트 완료 (LAST_SUCCESS_DATE = NOW() - {}시간)", lastExecutionBufferHours); + 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; }; } 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 2445f9a..01462c2 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 @@ -30,6 +30,8 @@ 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; @@ -55,11 +57,6 @@ public class ComplianceImportRangeJobConfig extends BaseMultiStepJobConfig { - log.info(">>>>> 모든 스텝 성공: BATCH_LAST_EXECUTION 업데이트 시작 (버퍼: {}시간)", lastExecutionBufferHours); + String toDateStr = chunkContext.getStepContext() + .getStepExecution().getJobExecution() + .getExecutionContext().getString("batchToDate", null); - jdbcTemplate.execute(getBatchUpdateSql()); + 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); + } - log.info(">>>>> BATCH_LAST_EXECUTION 업데이트 완료 (LAST_SUCCESS_DATE = NOW() - {}시간)", lastExecutionBufferHours); + 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; }; } 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 9834a2e..cae4046 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 @@ -30,6 +30,9 @@ 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 { @@ -51,11 +54,6 @@ public class EventImportJobConfig extends BaseMultiStepJobConfig { - log.info(">>>>> 모든 스텝 성공: BATCH_LAST_EXECUTION 업데이트 시작 (버퍼: {}시간)", lastExecutionBufferHours); + String toDateStr = chunkContext.getStepContext() + .getStepExecution().getJobExecution() + .getExecutionContext().getString("batchToDate", null); - jdbcTemplate.execute(getBatchUpdateSql()); + 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); + } - log.info(">>>>> BATCH_LAST_EXECUTION 업데이트 완료 (LAST_SUCCESS_DATE = NOW() - {}시간)", lastExecutionBufferHours); + 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; }; } 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 9ef17cd..eafc25b 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 @@ -29,6 +29,9 @@ 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 AnchorageCallsRangeJobConfig extends BaseMultiStepJobConfig { @@ -49,8 +52,6 @@ public class AnchorageCallsRangeJobConfig extends BaseMultiStepJobConfig { - log.info(">>>>> 모든 스텝 성공: BATCH_LAST_EXECUTION 업데이트 시작"); + String toDateStr = chunkContext.getStepContext() + .getStepExecution().getJobExecution() + .getExecutionContext().getString("batchToDate", null); - jdbcTemplate.execute(getBatchUpdateSql()); + LocalDateTime successDate; + if (toDateStr != null) { + successDate = LocalDateTime.parse(toDateStr); + log.info(">>>>> BATCH_LAST_EXECUTION 업데이트 시작 (캡처된 toDate: {})", successDate); + } else { + successDate = LocalDateTime.now(); + log.warn(">>>>> batchToDate가 없어 현재 시간 사용: {}", successDate); + } - log.info(">>>>> BATCH_LAST_EXECUTION 업데이트 완료"); + 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; }; } 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 5d7aff3..344407a 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 @@ -29,6 +29,9 @@ 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 BerthCallsRangJobConfig extends BaseMultiStepJobConfig { @@ -48,8 +51,6 @@ public class BerthCallsRangJobConfig extends BaseMultiStepJobConfig { - log.info(">>>>> 모든 스텝 성공: BATCH_LAST_EXECUTION 업데이트 시작"); + String toDateStr = chunkContext.getStepContext() + .getStepExecution().getJobExecution() + .getExecutionContext().getString("batchToDate", null); - jdbcTemplate.execute(getBatchUpdateSql()); + LocalDateTime successDate; + if (toDateStr != null) { + successDate = LocalDateTime.parse(toDateStr); + log.info(">>>>> BATCH_LAST_EXECUTION 업데이트 시작 (캡처된 toDate: {})", successDate); + } else { + successDate = LocalDateTime.now(); + log.warn(">>>>> batchToDate가 없어 현재 시간 사용: {}", successDate); + } - log.info(">>>>> BATCH_LAST_EXECUTION 업데이트 완료"); + 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; }; } 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 295cb67..31b0aed 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 @@ -29,6 +29,9 @@ 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 CurrentlyAtRangeJobConfig extends BaseMultiStepJobConfig { @@ -48,8 +51,6 @@ public class CurrentlyAtRangeJobConfig extends BaseMultiStepJobConfig { - log.info(">>>>> 모든 스텝 성공: BATCH_LAST_EXECUTION 업데이트 시작"); + String toDateStr = chunkContext.getStepContext() + .getStepExecution().getJobExecution() + .getExecutionContext().getString("batchToDate", null); - jdbcTemplate.execute(getBatchUpdateSql()); + LocalDateTime successDate; + if (toDateStr != null) { + successDate = LocalDateTime.parse(toDateStr); + log.info(">>>>> BATCH_LAST_EXECUTION 업데이트 시작 (캡처된 toDate: {})", successDate); + } else { + successDate = LocalDateTime.now(); + log.warn(">>>>> batchToDate가 없어 현재 시간 사용: {}", successDate); + } - log.info(">>>>> BATCH_LAST_EXECUTION 업데이트 완료"); + 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; }; } 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 0049772..2e47c7d 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 @@ -29,6 +29,9 @@ 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 DestinationsRangeJobConfig extends BaseMultiStepJobConfig { @@ -48,8 +51,6 @@ public class DestinationsRangeJobConfig extends BaseMultiStepJobConfig { - log.info(">>>>> 모든 스텝 성공: BATCH_LAST_EXECUTION 업데이트 시작"); + String toDateStr = chunkContext.getStepContext() + .getStepExecution().getJobExecution() + .getExecutionContext().getString("batchToDate", null); - jdbcTemplate.execute(getBatchUpdateSql()); + LocalDateTime successDate; + if (toDateStr != null) { + successDate = LocalDateTime.parse(toDateStr); + log.info(">>>>> BATCH_LAST_EXECUTION 업데이트 시작 (캡처된 toDate: {})", successDate); + } else { + successDate = LocalDateTime.now(); + log.warn(">>>>> batchToDate가 없어 현재 시간 사용: {}", successDate); + } - log.info(">>>>> BATCH_LAST_EXECUTION 업데이트 완료"); + 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; }; } 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 996c2e1..f2cb4c6 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 @@ -29,6 +29,9 @@ 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 ShipPortCallsRangeJobConfig extends BaseMultiStepJobConfig { @@ -48,8 +51,6 @@ public class ShipPortCallsRangeJobConfig extends BaseMultiStepJobConfig { - log.info(">>>>> 모든 스텝 성공: BATCH_LAST_EXECUTION 업데이트 시작"); + String toDateStr = chunkContext.getStepContext() + .getStepExecution().getJobExecution() + .getExecutionContext().getString("batchToDate", null); - jdbcTemplate.execute(getBatchUpdateSql()); + LocalDateTime successDate; + if (toDateStr != null) { + successDate = LocalDateTime.parse(toDateStr); + log.info(">>>>> BATCH_LAST_EXECUTION 업데이트 시작 (캡처된 toDate: {})", successDate); + } else { + successDate = LocalDateTime.now(); + log.warn(">>>>> batchToDate가 없어 현재 시간 사용: {}", successDate); + } - log.info(">>>>> BATCH_LAST_EXECUTION 업데이트 완료"); + 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; }; } 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 20b1b95..8b29f82 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 @@ -29,6 +29,9 @@ 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 StsOperationRangeJobConfig extends BaseMultiStepJobConfig { @@ -48,8 +51,6 @@ public class StsOperationRangeJobConfig extends BaseMultiStepJobConfig { - log.info(">>>>> 모든 스텝 성공: BATCH_LAST_EXECUTION 업데이트 시작"); + String toDateStr = chunkContext.getStepContext() + .getStepExecution().getJobExecution() + .getExecutionContext().getString("batchToDate", null); - jdbcTemplate.execute(getBatchUpdateSql()); + LocalDateTime successDate; + if (toDateStr != null) { + successDate = LocalDateTime.parse(toDateStr); + log.info(">>>>> BATCH_LAST_EXECUTION 업데이트 시작 (캡처된 toDate: {})", successDate); + } else { + successDate = LocalDateTime.now(); + log.warn(">>>>> batchToDate가 없어 현재 시간 사용: {}", successDate); + } - log.info(">>>>> BATCH_LAST_EXECUTION 업데이트 완료"); + 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; }; } 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 6e25a8b..ea0bfe0 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 @@ -29,6 +29,9 @@ 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 TerminalCallsRangeJobConfig extends BaseMultiStepJobConfig { @@ -48,8 +51,6 @@ public class TerminalCallsRangeJobConfig extends BaseMultiStepJobConfig { - log.info(">>>>> 모든 스텝 성공: BATCH_LAST_EXECUTION 업데이트 시작"); + String toDateStr = chunkContext.getStepContext() + .getStepExecution().getJobExecution() + .getExecutionContext().getString("batchToDate", null); - jdbcTemplate.execute(getBatchUpdateSql()); + LocalDateTime successDate; + if (toDateStr != null) { + successDate = LocalDateTime.parse(toDateStr); + log.info(">>>>> BATCH_LAST_EXECUTION 업데이트 시작 (캡처된 toDate: {})", successDate); + } else { + successDate = LocalDateTime.now(); + log.warn(">>>>> batchToDate가 없어 현재 시간 사용: {}", successDate); + } - log.info(">>>>> BATCH_LAST_EXECUTION 업데이트 완료"); + 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; }; } 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 0f00fe1..6f9e510 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 @@ -28,6 +28,9 @@ 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 TransitsRangeJobConfig extends BaseMultiStepJobConfig { @@ -47,8 +50,6 @@ public class TransitsRangeJobConfig extends BaseMultiStepJobConfig { - log.info(">>>>> 모든 스텝 성공: BATCH_LAST_EXECUTION 업데이트 시작"); + String toDateStr = chunkContext.getStepContext() + .getStepExecution().getJobExecution() + .getExecutionContext().getString("batchToDate", null); - jdbcTemplate.execute(getBatchUpdateSql()); + LocalDateTime successDate; + if (toDateStr != null) { + successDate = LocalDateTime.parse(toDateStr); + log.info(">>>>> BATCH_LAST_EXECUTION 업데이트 시작 (캡처된 toDate: {})", successDate); + } else { + successDate = LocalDateTime.now(); + log.warn(">>>>> batchToDate가 없어 현재 시간 사용: {}", successDate); + } - log.info(">>>>> BATCH_LAST_EXECUTION 업데이트 완료"); + 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; }; } 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 bb37df9..86cd988 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 @@ -32,6 +32,9 @@ 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 { @@ -53,11 +56,6 @@ public class PscInspectionJobConfig extends BaseMultiStepJobConfig { - log.info(">>>>> 모든 스텝 성공: BATCH_LAST_EXECUTION 업데이트 시작 (버퍼: {}시간)", lastExecutionBufferHours); + String toDateStr = chunkContext.getStepContext() + .getStepExecution().getJobExecution() + .getExecutionContext().getString("batchToDate", null); - jdbcTemplate.execute(getBatchUpdateSql()); + 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); + } - log.info(">>>>> BATCH_LAST_EXECUTION 업데이트 완료 (LAST_SUCCESS_DATE = NOW() - {}시간)", lastExecutionBufferHours); + 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; }; } 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 8934a9d..abcd22a 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 @@ -30,6 +30,9 @@ 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 { @@ -51,11 +54,6 @@ public class RiskImportRangeJobConfig extends BaseMultiStepJobConfig { - log.info(">>>>> 모든 스텝 성공: BATCH_LAST_EXECUTION 업데이트 시작 (버퍼: {}시간)", lastExecutionBufferHours); + String toDateStr = chunkContext.getStepContext() + .getStepExecution().getJobExecution() + .getExecutionContext().getString("batchToDate", null); - jdbcTemplate.execute(getBatchUpdateSql()); + 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); + } - log.info(">>>>> BATCH_LAST_EXECUTION 업데이트 완료 (LAST_SUCCESS_DATE = NOW() - {}시간)", lastExecutionBufferHours); + 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; }; } diff --git a/src/main/java/com/snp/batch/jobs/shipdetail/batch/config/ShipDetailSyncJobConfig.java b/src/main/java/com/snp/batch/jobs/shipdetail/batch/config/ShipDetailSyncJobConfig.java index ce3abe8..8cb048c 100644 --- a/src/main/java/com/snp/batch/jobs/shipdetail/batch/config/ShipDetailSyncJobConfig.java +++ b/src/main/java/com/snp/batch/jobs/shipdetail/batch/config/ShipDetailSyncJobConfig.java @@ -15,6 +15,8 @@ import org.springframework.transaction.PlatformTransactionManager; import org.springframework.beans.factory.annotation.Value; +import java.sql.Timestamp; +import java.time.LocalDateTime; import java.util.Arrays; import java.util.List; @@ -36,13 +38,6 @@ public class ShipDetailSyncJobConfig { return "SHIP_DETAIL_SYNC_API"; } - // 마지막 실행 일자 업데이트 SQL - protected String getBatchUpdateSql() { - return String.format( - "UPDATE %s.BATCH_LAST_EXECUTION SET LAST_SUCCESS_DATE = NOW() - INTERVAL '%d HOURS', UPDATED_AT = NOW() WHERE API_KEY = '%s'", - targetSchema, lastExecutionBufferHours, getApiKey() - ); - } public ShipDetailSyncJobConfig( JobRepository jobRepository, @@ -85,6 +80,13 @@ public class ShipDetailSyncJobConfig { @Bean public Tasklet shipMasterAndCoreSyncTasklet() { return (contribution, chunkContext) -> { + // 배치 시작 시점 캡처 (LastExecutionUpdate에서 사용) + LocalDateTime toDate = LocalDateTime.now(); + chunkContext.getStepContext() + .getStepExecution().getJobExecution() + .getExecutionContext().put("batchToDate", toDate.toString()); + log.info(">>>>> batchToDate 캡처: {}", toDate); + log.info(">>>>> SHIP MASTER & CORE20 동기화 프로시저 호출 시작"); // PostgreSQL 기준 프로시저 호출 (CALL) @@ -142,11 +144,25 @@ public class ShipDetailSyncJobConfig { @Bean public Tasklet shipDetailSyncLastExecutionUpdateTasklet() { return (contribution, chunkContext) -> { - log.info(">>>>> 모든 테이블 동기화 성공: BATCH_LAST_EXECUTION 업데이트 시작 (버퍼: {}시간)", lastExecutionBufferHours); + String toDateStr = chunkContext.getStepContext() + .getStepExecution().getJobExecution() + .getExecutionContext().getString("batchToDate", null); - jdbcTemplate.execute(getBatchUpdateSql()); + 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); + } - log.info(">>>>> BATCH_LAST_EXECUTION 업데이트 완료 (LAST_SUCCESS_DATE = NOW() - {}시간)", lastExecutionBufferHours); + 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; }; } diff --git a/src/main/java/com/snp/batch/jobs/shipdetail/batch/config/ShipDetailUpdateJobConfig.java b/src/main/java/com/snp/batch/jobs/shipdetail/batch/config/ShipDetailUpdateJobConfig.java index ae83038..9813ddb 100644 --- a/src/main/java/com/snp/batch/jobs/shipdetail/batch/config/ShipDetailUpdateJobConfig.java +++ b/src/main/java/com/snp/batch/jobs/shipdetail/batch/config/ShipDetailUpdateJobConfig.java @@ -34,6 +34,8 @@ 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.util.Arrays; import java.util.List; @@ -73,11 +75,6 @@ public class ShipDetailUpdateJobConfig extends BaseMultiStepJobConfig { - log.info(">>>>> 모든 스텝 성공: BATCH_LAST_EXECUTION 업데이트 시작 (버퍼: {}시간)", lastExecutionBufferHours); + String toDateStr = chunkContext.getStepContext() + .getStepExecution().getJobExecution() + .getExecutionContext().getString("batchToDate", null); - jdbcTemplate.execute(getBatchUpdateSql()); + 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); + } - log.info(">>>>> BATCH_LAST_EXECUTION 업데이트 완료 (LAST_SUCCESS_DATE = NOW() - {}시간)", lastExecutionBufferHours); + 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; }; } diff --git a/src/main/java/com/snp/batch/service/BatchDateService.java b/src/main/java/com/snp/batch/service/BatchDateService.java index 6ba45ee..13da871 100644 --- a/src/main/java/com/snp/batch/service/BatchDateService.java +++ b/src/main/java/com/snp/batch/service/BatchDateService.java @@ -66,9 +66,12 @@ public class BatchDateService { // 정상 모드: last_success_date ~ now() return repository.findDateRangeByApiKey(apiKey) .map(projection -> { + LocalDateTime toDate = LocalDateTime.now(); + saveToDateToJobContext(toDate); + Map params = new HashMap<>(); putDateParams(params, "from", projection.getLastSuccessDate()); - putDateParams(params, "to", LocalDateTime.now()); + putDateParams(params, "to", toDate); params.put("shipsCategory", "0"); return params; }) @@ -93,9 +96,12 @@ public class BatchDateService { // 정상 모드: last_success_date ~ now() return repository.findDateRangeByApiKey(apiKey) .map(projection -> { + LocalDateTime toDate = LocalDateTime.now(); + saveToDateToJobContext(toDate); + Map params = new HashMap<>(); params.put(dateParam1, formatToUtc(projection.getLastSuccessDate(), formatter)); - params.put(dateParam2, formatToUtc(LocalDateTime.now(), formatter)); + params.put(dateParam2, formatToUtc(toDate, formatter)); return params; }) .orElseGet(() -> { @@ -152,6 +158,23 @@ public class BatchDateService { return params; } + /** + * 배치 시작 시 캡처한 toDate를 JobExecutionContext에 저장 + * LastExecutionUpdateTasklet에서 이 값을 꺼내 LAST_SUCCESS_DATE로 사용 + */ + private void saveToDateToJobContext(LocalDateTime toDate) { + try { + StepContext context = StepSynchronizationManager.getContext(); + if (context != null && context.getStepExecution() != null) { + context.getStepExecution().getJobExecution() + .getExecutionContext().put("batchToDate", toDate.toString()); + log.debug("batchToDate JobContext 저장 완료: {}", toDate); + } + } catch (Exception e) { + log.warn("batchToDate JobContext 저장 실패", e); + } + } + /** * LocalDateTime에서 연, 월, 일을 추출하여 Map에 담는 헬퍼 메소드 */