refactor(batch): 13개 Job Config의 인라인 LastExecutionUpdateTasklet을 공통 모듈로 교체

movement(8개), risk, psc, event, compliance(2개) Job Config에서
중복된 인라인 Tasklet 람다를 LastExecutionUpdateTasklet 공통 클래스로 교체

Closes #74

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
HYOJIN 2026-03-23 10:57:37 +09:00
부모 7bacd1a989
커밋 891d46ac23
13개의 변경된 파일26개의 추가작업 그리고 430개의 파일을 삭제

파일 보기

@ -1,6 +1,7 @@
package com.snp.batch.jobs.compliance.batch.config; package com.snp.batch.jobs.compliance.batch.config;
import com.snp.batch.common.batch.config.BaseMultiStepJobConfig; 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.dto.CompanyComplianceDto;
import com.snp.batch.jobs.compliance.batch.entity.CompanyComplianceEntity; import com.snp.batch.jobs.compliance.batch.entity.CompanyComplianceEntity;
import com.snp.batch.jobs.compliance.batch.processor.CompanyComplianceDataProcessor; 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.transaction.PlatformTransactionManager;
import org.springframework.web.reactive.function.client.WebClient; import org.springframework.web.reactive.function.client.WebClient;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.time.OffsetDateTime; import java.time.OffsetDateTime;
import java.time.ZoneId; import java.time.ZoneId;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
@ -211,36 +210,7 @@ public class CompanyComplianceImportRangeJobConfig extends BaseMultiStepJobConfi
*/ */
@Bean @Bean
public Tasklet companyComplianceLastExecutionUpdateTasklet() { public Tasklet companyComplianceLastExecutionUpdateTasklet() {
return (contribution, chunkContext) -> { return new LastExecutionUpdateTasklet(jdbcTemplate, targetSchema, getApiKey(), lastExecutionBufferHours);
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;
};
} }
@Bean(name = "CompanyComplianceLastExecutionUpdateStep") @Bean(name = "CompanyComplianceLastExecutionUpdateStep")
public Step companyComplianceLastExecutionUpdateStep() { public Step companyComplianceLastExecutionUpdateStep() {

파일 보기

@ -1,6 +1,7 @@
package com.snp.batch.jobs.compliance.batch.config; package com.snp.batch.jobs.compliance.batch.config;
import com.snp.batch.common.batch.config.BaseMultiStepJobConfig; 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.dto.ComplianceDto;
import com.snp.batch.jobs.compliance.batch.entity.ComplianceEntity; import com.snp.batch.jobs.compliance.batch.entity.ComplianceEntity;
import com.snp.batch.jobs.compliance.batch.processor.ComplianceDataProcessor; 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.transaction.PlatformTransactionManager;
import org.springframework.web.reactive.function.client.WebClient; import org.springframework.web.reactive.function.client.WebClient;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.time.OffsetDateTime; import java.time.OffsetDateTime;
import java.time.ZoneId; import java.time.ZoneId;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
@ -213,36 +212,7 @@ public class ComplianceImportRangeJobConfig extends BaseMultiStepJobConfig<Compl
*/ */
@Bean @Bean
public Tasklet complianceLastExecutionUpdateTasklet() { public Tasklet complianceLastExecutionUpdateTasklet() {
return (contribution, chunkContext) -> { return new LastExecutionUpdateTasklet(jdbcTemplate, targetSchema, getApiKey(), lastExecutionBufferHours);
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;
};
} }
@Bean(name = "ComplianceLastExecutionUpdateStep") @Bean(name = "ComplianceLastExecutionUpdateStep")
public Step complianceLastExecutionUpdateStep() { public Step complianceLastExecutionUpdateStep() {

파일 보기

@ -1,6 +1,7 @@
package com.snp.batch.jobs.event.batch.config; package com.snp.batch.jobs.event.batch.config;
import com.snp.batch.common.batch.config.BaseMultiStepJobConfig; 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.dto.EventDetailDto;
import com.snp.batch.jobs.event.batch.entity.EventDetailEntity; import com.snp.batch.jobs.event.batch.entity.EventDetailEntity;
import com.snp.batch.jobs.event.batch.processor.EventDataProcessor; 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.ItemProcessor;
import org.springframework.batch.item.ItemReader; import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.ItemWriter; 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.Qualifier;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
@ -30,9 +30,6 @@ import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.web.reactive.function.client.WebClient; import org.springframework.web.reactive.function.client.WebClient;
import java.sql.Timestamp;
import java.time.LocalDateTime;
@Slf4j @Slf4j
@Configuration @Configuration
public class EventImportJobConfig extends BaseMultiStepJobConfig<EventDetailDto, EventDetailEntity> { public class EventImportJobConfig extends BaseMultiStepJobConfig<EventDetailDto, EventDetailEntity> {
@ -159,36 +156,7 @@ public class EventImportJobConfig extends BaseMultiStepJobConfig<EventDetailDto,
*/ */
@Bean @Bean
public Tasklet eventLastExecutionUpdateTasklet() { public Tasklet eventLastExecutionUpdateTasklet() {
return (contribution, chunkContext) -> { return new LastExecutionUpdateTasklet(jdbcTemplate, targetSchema, getApiKey(), lastExecutionBufferHours);
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;
};
} }
@Bean(name = "EventLastExecutionUpdateStep") @Bean(name = "EventLastExecutionUpdateStep")
public Step eventLastExecutionUpdateStep() { public Step eventLastExecutionUpdateStep() {

파일 보기

@ -2,6 +2,7 @@ package com.snp.batch.jobs.movement.batch.config;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.snp.batch.common.batch.config.BaseMultiStepJobConfig; 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.dto.AnchorageCallsDto;
import com.snp.batch.jobs.movement.batch.entity.AnchorageCallsEntity; import com.snp.batch.jobs.movement.batch.entity.AnchorageCallsEntity;
import com.snp.batch.jobs.movement.batch.processor.AnchorageCallsProcessor; 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.ItemProcessor;
import org.springframework.batch.item.ItemReader; import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.ItemWriter; 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.Qualifier;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
@ -29,8 +29,6 @@ import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.web.reactive.function.client.WebClient; import org.springframework.web.reactive.function.client.WebClient;
import java.sql.Timestamp;
import java.time.LocalDateTime;
@Slf4j @Slf4j
@Configuration @Configuration
@ -149,36 +147,7 @@ public class AnchorageCallsRangeJobConfig extends BaseMultiStepJobConfig<Anchora
*/ */
@Bean @Bean
public Tasklet anchorageCallsLastExecutionUpdateTasklet() { public Tasklet anchorageCallsLastExecutionUpdateTasklet() {
return (contribution, chunkContext) -> { return new LastExecutionUpdateTasklet(jdbcTemplate, targetSchema, getApiKey(), 0);
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;
};
} }
@Bean(name = "AnchorageCallsLastExecutionUpdateStep") @Bean(name = "AnchorageCallsLastExecutionUpdateStep")
public Step anchorageCallsLastExecutionUpdateStep() { public Step anchorageCallsLastExecutionUpdateStep() {

파일 보기

@ -2,6 +2,7 @@ package com.snp.batch.jobs.movement.batch.config;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.snp.batch.common.batch.config.BaseMultiStepJobConfig; 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.dto.BerthCallsDto;
import com.snp.batch.jobs.movement.batch.entity.BerthCallsEntity; import com.snp.batch.jobs.movement.batch.entity.BerthCallsEntity;
import com.snp.batch.jobs.movement.batch.processor.BerthCallsProcessor; 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.ItemProcessor;
import org.springframework.batch.item.ItemReader; import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.ItemWriter; 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.Qualifier;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
@ -29,8 +29,6 @@ import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.web.reactive.function.client.WebClient; import org.springframework.web.reactive.function.client.WebClient;
import java.sql.Timestamp;
import java.time.LocalDateTime;
@Slf4j @Slf4j
@Configuration @Configuration
@ -143,36 +141,7 @@ public class BerthCallsRangJobConfig extends BaseMultiStepJobConfig<BerthCallsDt
*/ */
@Bean @Bean
public Tasklet berthCallsLastExecutionUpdateTasklet() { public Tasklet berthCallsLastExecutionUpdateTasklet() {
return (contribution, chunkContext) -> { return new LastExecutionUpdateTasklet(jdbcTemplate, targetSchema, getApiKey(), 0);
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;
};
} }
@Bean(name = "BerthCallsLastExecutionUpdateStep") @Bean(name = "BerthCallsLastExecutionUpdateStep")
public Step berthCallsLastExecutionUpdateStep() { public Step berthCallsLastExecutionUpdateStep() {

파일 보기

@ -2,6 +2,7 @@ package com.snp.batch.jobs.movement.batch.config;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.snp.batch.common.batch.config.BaseMultiStepJobConfig; 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.dto.CurrentlyAtDto;
import com.snp.batch.jobs.movement.batch.entity.CurrentlyAtEntity; import com.snp.batch.jobs.movement.batch.entity.CurrentlyAtEntity;
import com.snp.batch.jobs.movement.batch.processor.CurrentlyAtProcessor; 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.ItemProcessor;
import org.springframework.batch.item.ItemReader; import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.ItemWriter; 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.Qualifier;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
@ -29,8 +29,6 @@ import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.web.reactive.function.client.WebClient; import org.springframework.web.reactive.function.client.WebClient;
import java.sql.Timestamp;
import java.time.LocalDateTime;
@Slf4j @Slf4j
@Configuration @Configuration
@ -141,36 +139,7 @@ public class CurrentlyAtRangeJobConfig extends BaseMultiStepJobConfig<CurrentlyA
*/ */
@Bean @Bean
public Tasklet currentlyAtLastExecutionUpdateTasklet() { public Tasklet currentlyAtLastExecutionUpdateTasklet() {
return (contribution, chunkContext) -> { return new LastExecutionUpdateTasklet(jdbcTemplate, targetSchema, getApiKey(), 0);
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;
};
} }
@Bean(name = "CurrentlyAtLastExecutionUpdateStep") @Bean(name = "CurrentlyAtLastExecutionUpdateStep")
public Step currentlyAtLastExecutionUpdateStep() { public Step currentlyAtLastExecutionUpdateStep() {

파일 보기

@ -2,6 +2,7 @@ package com.snp.batch.jobs.movement.batch.config;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.snp.batch.common.batch.config.BaseMultiStepJobConfig; 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.dto.DestinationDto;
import com.snp.batch.jobs.movement.batch.entity.DestinationEntity; import com.snp.batch.jobs.movement.batch.entity.DestinationEntity;
import com.snp.batch.jobs.movement.batch.processor.DestinationProcessor; 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.ItemProcessor;
import org.springframework.batch.item.ItemReader; import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.ItemWriter; 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.Qualifier;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
@ -29,8 +29,6 @@ import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.web.reactive.function.client.WebClient; import org.springframework.web.reactive.function.client.WebClient;
import java.sql.Timestamp;
import java.time.LocalDateTime;
@Slf4j @Slf4j
@Configuration @Configuration
@ -144,36 +142,7 @@ public class DestinationsRangeJobConfig extends BaseMultiStepJobConfig<Destinati
*/ */
@Bean @Bean
public Tasklet destinationsLastExecutionUpdateTasklet() { public Tasklet destinationsLastExecutionUpdateTasklet() {
return (contribution, chunkContext) -> { return new LastExecutionUpdateTasklet(jdbcTemplate, targetSchema, getApiKey(), 0);
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;
};
} }
@Bean(name = "DestinationsLastExecutionUpdateStep") @Bean(name = "DestinationsLastExecutionUpdateStep")
public Step destinationsLastExecutionUpdateStep() { public Step destinationsLastExecutionUpdateStep() {

파일 보기

@ -2,6 +2,7 @@ package com.snp.batch.jobs.movement.batch.config;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.snp.batch.common.batch.config.BaseMultiStepJobConfig; 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.dto.PortCallsDto;
import com.snp.batch.jobs.movement.batch.entity.PortCallsEntity; import com.snp.batch.jobs.movement.batch.entity.PortCallsEntity;
import com.snp.batch.jobs.movement.batch.processor.PortCallsProcessor; 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.ItemProcessor;
import org.springframework.batch.item.ItemReader; import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.ItemWriter; 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.Qualifier;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
@ -29,8 +29,6 @@ import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.web.reactive.function.client.WebClient; import org.springframework.web.reactive.function.client.WebClient;
import java.sql.Timestamp;
import java.time.LocalDateTime;
@Slf4j @Slf4j
@Configuration @Configuration
@ -145,36 +143,7 @@ public class ShipPortCallsRangeJobConfig extends BaseMultiStepJobConfig<PortCall
*/ */
@Bean @Bean
public Tasklet portCallsLastExecutionUpdateTasklet() { public Tasklet portCallsLastExecutionUpdateTasklet() {
return (contribution, chunkContext) -> { return new LastExecutionUpdateTasklet(jdbcTemplate, targetSchema, getApiKey(), 0);
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;
};
} }
@Bean(name = "PortCallsLastExecutionUpdateStep") @Bean(name = "PortCallsLastExecutionUpdateStep")
public Step portCallsLastExecutionUpdateStep() { public Step portCallsLastExecutionUpdateStep() {

파일 보기

@ -2,6 +2,7 @@ package com.snp.batch.jobs.movement.batch.config;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.snp.batch.common.batch.config.BaseMultiStepJobConfig; 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.dto.StsOperationDto;
import com.snp.batch.jobs.movement.batch.entity.StsOperationEntity; import com.snp.batch.jobs.movement.batch.entity.StsOperationEntity;
import com.snp.batch.jobs.movement.batch.processor.StsOperationProcessor; 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.ItemProcessor;
import org.springframework.batch.item.ItemReader; import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.ItemWriter; 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.Qualifier;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
@ -29,8 +29,6 @@ import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.web.reactive.function.client.WebClient; import org.springframework.web.reactive.function.client.WebClient;
import java.sql.Timestamp;
import java.time.LocalDateTime;
@Slf4j @Slf4j
@Configuration @Configuration
@ -143,36 +141,7 @@ public class StsOperationRangeJobConfig extends BaseMultiStepJobConfig<StsOperat
*/ */
@Bean @Bean
public Tasklet stsOperationLastExecutionUpdateTasklet() { public Tasklet stsOperationLastExecutionUpdateTasklet() {
return (contribution, chunkContext) -> { return new LastExecutionUpdateTasklet(jdbcTemplate, targetSchema, getApiKey(), 0);
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;
};
} }
@Bean(name = "StsOperationLastExecutionUpdateStep") @Bean(name = "StsOperationLastExecutionUpdateStep")
public Step stsOperationLastExecutionUpdateStep() { public Step stsOperationLastExecutionUpdateStep() {

파일 보기

@ -2,6 +2,7 @@ package com.snp.batch.jobs.movement.batch.config;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.snp.batch.common.batch.config.BaseMultiStepJobConfig; 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.dto.TerminalCallsDto;
import com.snp.batch.jobs.movement.batch.entity.TerminalCallsEntity; import com.snp.batch.jobs.movement.batch.entity.TerminalCallsEntity;
import com.snp.batch.jobs.movement.batch.processor.TerminalCallsProcessor; 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.ItemProcessor;
import org.springframework.batch.item.ItemReader; import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.ItemWriter; 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.Qualifier;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
@ -29,8 +29,6 @@ import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.web.reactive.function.client.WebClient; import org.springframework.web.reactive.function.client.WebClient;
import java.sql.Timestamp;
import java.time.LocalDateTime;
@Slf4j @Slf4j
@Configuration @Configuration
@ -143,36 +141,7 @@ public class TerminalCallsRangeJobConfig extends BaseMultiStepJobConfig<Terminal
*/ */
@Bean @Bean
public Tasklet terminalCallsLastExecutionUpdateTasklet() { public Tasklet terminalCallsLastExecutionUpdateTasklet() {
return (contribution, chunkContext) -> { return new LastExecutionUpdateTasklet(jdbcTemplate, targetSchema, getApiKey(), 0);
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;
};
} }
@Bean(name = "TerminalCallsLastExecutionUpdateStep") @Bean(name = "TerminalCallsLastExecutionUpdateStep")
public Step terminalCallsLastExecutionUpdateStep() { public Step terminalCallsLastExecutionUpdateStep() {

파일 보기

@ -1,6 +1,7 @@
package com.snp.batch.jobs.movement.batch.config; package com.snp.batch.jobs.movement.batch.config;
import com.snp.batch.common.batch.config.BaseMultiStepJobConfig; 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.dto.TransitsDto;
import com.snp.batch.jobs.movement.batch.entity.TransitsEntity; import com.snp.batch.jobs.movement.batch.entity.TransitsEntity;
import com.snp.batch.jobs.movement.batch.processor.TransitsProcessor; 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.ItemProcessor;
import org.springframework.batch.item.ItemReader; import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.ItemWriter; 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.Qualifier;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
@ -28,8 +28,6 @@ import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.web.reactive.function.client.WebClient; import org.springframework.web.reactive.function.client.WebClient;
import java.sql.Timestamp;
import java.time.LocalDateTime;
@Slf4j @Slf4j
@Configuration @Configuration
@ -141,36 +139,7 @@ public class TransitsRangeJobConfig extends BaseMultiStepJobConfig<TransitsDto,
*/ */
@Bean @Bean
public Tasklet transitsLastExecutionUpdateTasklet() { public Tasklet transitsLastExecutionUpdateTasklet() {
return (contribution, chunkContext) -> { return new LastExecutionUpdateTasklet(jdbcTemplate, targetSchema, getApiKey(), 0);
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;
};
} }
@Bean(name = "TransitsLastExecutionUpdateStep") @Bean(name = "TransitsLastExecutionUpdateStep")
public Step transitsLastExecutionUpdateStep() { public Step transitsLastExecutionUpdateStep() {

파일 보기

@ -2,6 +2,7 @@ package com.snp.batch.jobs.pscInspection.batch.config;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.snp.batch.common.batch.config.BaseMultiStepJobConfig; 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.facility.batch.processor.PortDataProcessor;
import com.snp.batch.jobs.pscInspection.batch.dto.PscInspectionDto; import com.snp.batch.jobs.pscInspection.batch.dto.PscInspectionDto;
import com.snp.batch.jobs.pscInspection.batch.entity.PscInspectionEntity; 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.ItemProcessor;
import org.springframework.batch.item.ItemReader; import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.ItemWriter; 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.Qualifier;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
@ -32,9 +32,6 @@ import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.web.reactive.function.client.WebClient; import org.springframework.web.reactive.function.client.WebClient;
import java.sql.Timestamp;
import java.time.LocalDateTime;
@Slf4j @Slf4j
@Configuration @Configuration
public class PscInspectionJobConfig extends BaseMultiStepJobConfig<PscInspectionDto, PscInspectionEntity> { public class PscInspectionJobConfig extends BaseMultiStepJobConfig<PscInspectionDto, PscInspectionEntity> {
@ -165,36 +162,7 @@ public class PscInspectionJobConfig extends BaseMultiStepJobConfig<PscInspection
*/ */
@Bean @Bean
public Tasklet pscLastExecutionUpdateTasklet() { public Tasklet pscLastExecutionUpdateTasklet() {
return (contribution, chunkContext) -> { return new LastExecutionUpdateTasklet(jdbcTemplate, targetSchema, getApiKey(), lastExecutionBufferHours);
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;
};
} }
@Bean(name = "PSCLastExecutionUpdateStep") @Bean(name = "PSCLastExecutionUpdateStep")
public Step pscLastExecutionUpdateStep() { public Step pscLastExecutionUpdateStep() {

파일 보기

@ -1,6 +1,7 @@
package com.snp.batch.jobs.risk.batch.config; package com.snp.batch.jobs.risk.batch.config;
import com.snp.batch.common.batch.config.BaseMultiStepJobConfig; 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.dto.RiskDto;
import com.snp.batch.jobs.risk.batch.entity.RiskEntity; import com.snp.batch.jobs.risk.batch.entity.RiskEntity;
import com.snp.batch.jobs.risk.batch.processor.RiskDataProcessor; 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.ItemProcessor;
import org.springframework.batch.item.ItemReader; import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.ItemWriter; 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.Qualifier;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
@ -30,9 +30,6 @@ import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.web.reactive.function.client.WebClient; import org.springframework.web.reactive.function.client.WebClient;
import java.sql.Timestamp;
import java.time.LocalDateTime;
@Slf4j @Slf4j
@Configuration @Configuration
public class RiskImportRangeJobConfig extends BaseMultiStepJobConfig<RiskDto, RiskEntity> { public class RiskImportRangeJobConfig extends BaseMultiStepJobConfig<RiskDto, RiskEntity> {
@ -157,36 +154,7 @@ public class RiskImportRangeJobConfig extends BaseMultiStepJobConfig<RiskDto, Ri
*/ */
@Bean @Bean
public Tasklet riskLastExecutionUpdateTasklet() { public Tasklet riskLastExecutionUpdateTasklet() {
return (contribution, chunkContext) -> { return new LastExecutionUpdateTasklet(jdbcTemplate, targetSchema, getApiKey(), lastExecutionBufferHours);
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;
};
} }
@Bean(name = "RiskLastExecutionUpdateStep") @Bean(name = "RiskLastExecutionUpdateStep")
public Step riskLastExecutionUpdateStep() { public Step riskLastExecutionUpdateStep() {