✨ Add Ship Detail Sync Job
This commit is contained in:
부모
1ab78e881f
커밋
9c021f298c
@ -0,0 +1,150 @@
|
||||
package com.snp.batch.jobs.shipdetail.batch.config;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.batch.core.Job;
|
||||
import org.springframework.batch.core.Step;
|
||||
import org.springframework.batch.core.job.builder.JobBuilder;
|
||||
import org.springframework.batch.core.repository.JobRepository;
|
||||
import org.springframework.batch.core.step.builder.StepBuilder;
|
||||
import org.springframework.batch.core.step.tasklet.Tasklet;
|
||||
import org.springframework.batch.repeat.RepeatStatus;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.jdbc.core.JdbcTemplate;
|
||||
import org.springframework.transaction.PlatformTransactionManager;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
@Slf4j
|
||||
@Configuration
|
||||
public class ShipDetailSyncJobConfig {
|
||||
private final JobRepository jobRepository;
|
||||
private final PlatformTransactionManager transactionManager;
|
||||
private final JdbcTemplate jdbcTemplate;
|
||||
|
||||
// API 키 정의 (배치 로그 관리용)
|
||||
protected String getApiKey() {
|
||||
return "SHIP_DETAIL_SYNC_API";
|
||||
}
|
||||
|
||||
// 마지막 실행 일자 업데이트 SQL
|
||||
protected String getBatchUpdateSql() {
|
||||
return String.format(
|
||||
"UPDATE SNP_DATA.BATCH_LAST_EXECUTION SET LAST_SUCCESS_DATE = NOW(), UPDATED_AT = NOW() WHERE API_KEY = '%s'",
|
||||
getApiKey()
|
||||
);
|
||||
}
|
||||
|
||||
public ShipDetailSyncJobConfig(
|
||||
JobRepository jobRepository,
|
||||
PlatformTransactionManager transactionManager,
|
||||
JdbcTemplate jdbcTemplate) {
|
||||
this.jobRepository = jobRepository;
|
||||
this.transactionManager = transactionManager;
|
||||
this.jdbcTemplate = jdbcTemplate;
|
||||
}
|
||||
|
||||
/**
|
||||
* 동기화 대상 25개 테이블 리스트
|
||||
*/
|
||||
private static final List<String> SYNC_TABLES = Arrays.asList(
|
||||
"additionalshipsdata", "bareboatcharterhistory",
|
||||
"callsignandmmsihistory", "classhistory", "companycompliancedetails",
|
||||
"companyvesselrelationships", "crewlist", "darkactivityconfirmed",
|
||||
"flaghistory", "groupbeneficialownerhistory", "iceclass", "namehistory",
|
||||
"operatorhistory", "ownerhistory", "pandihistory", "safetymanagementcertificatehist",
|
||||
"shipmanagerhistory", "sistershiplinks", "specialfeature", "statushistory",
|
||||
"stowagecommodity", "surveydates", "surveydateshistoryunique",
|
||||
"technicalmanagerhistory", "thrusters"
|
||||
);
|
||||
|
||||
/**
|
||||
* Job 구성: 모든 테이블 동기화 후 마지막 업데이트 실행
|
||||
*/
|
||||
@Bean(name = "ShipDetailSyncJob")
|
||||
public Job shipDetailSyncJob() {
|
||||
return new JobBuilder("ShipDetailSyncJob", jobRepository)
|
||||
.start(shipMasterAndCoreSyncStep()) // 1단계: Ship_Detail_Data, Core20 테이블 동기화
|
||||
.next(shipDetailSyncStep()) // 2단계: 선박제원정보 종속 25개 테이블 순차 동기화
|
||||
.next(shipDetailSyncLastExecutionUpdateStep()) // 3단계: 최종 성공 시간 업데이트
|
||||
.build();
|
||||
}
|
||||
|
||||
/**
|
||||
* 1단계: Ship_Detail_Data, Core20 테이블 동기화
|
||||
*/
|
||||
@Bean
|
||||
public Tasklet shipMasterAndCoreSyncTasklet() {
|
||||
return (contribution, chunkContext) -> {
|
||||
log.info(">>>>> SHIP MASTER & CORE20 동기화 프로시저 호출 시작");
|
||||
|
||||
// PostgreSQL 기준 프로시저 호출 (CALL)
|
||||
jdbcTemplate.execute("CALL snp_data.proc_sync_ship_master_and_core()");
|
||||
|
||||
log.info(">>>>> SHIP MASTER & CORE20 동기화 프로시저 호출 완료");
|
||||
return RepeatStatus.FINISHED;
|
||||
};
|
||||
}
|
||||
|
||||
@Bean(name = "ShipMasterAndCoreSyncStep")
|
||||
public Step shipMasterAndCoreSyncStep() {
|
||||
return new StepBuilder("ShipMasterAndCoreSyncStep", jobRepository)
|
||||
.tasklet(shipMasterAndCoreSyncTasklet(), transactionManager)
|
||||
.build();
|
||||
}
|
||||
|
||||
/**
|
||||
* 2단계: 25개 테이블 동기화 Tasklet
|
||||
*/
|
||||
@Bean
|
||||
public Tasklet shipDetailSyncTasklet() {
|
||||
return (contribution, chunkContext) -> {
|
||||
log.info(">>>>> [시작] 25개 테이블 동기화 프로세스");
|
||||
|
||||
for (String tableName : SYNC_TABLES) {
|
||||
try {
|
||||
log.info("테이블 동기화 중: {}", tableName);
|
||||
// 이전에 생성한 동적 프로시저 호출
|
||||
jdbcTemplate.execute("CALL snp_data.proc_sync_ship_detail('" + tableName + "')");
|
||||
} catch (Exception e) {
|
||||
log.error("테이블 동기화 실패: {}. 에러: {}", tableName, e.getMessage());
|
||||
// 특정 테이블 실패 시 중단할지, 계속 진행할지에 따라 throw 여부 결정
|
||||
throw e; // 중단하려면 주석 해제
|
||||
}
|
||||
}
|
||||
|
||||
log.info(">>>>> [완료] 25개 테이블 동기화 프로세스");
|
||||
return RepeatStatus.FINISHED;
|
||||
};
|
||||
}
|
||||
|
||||
@Bean(name = "ShipDetailSyncStep")
|
||||
public Step shipDetailSyncStep() {
|
||||
return new StepBuilder("ShipDetailSyncStep", jobRepository)
|
||||
.tasklet(shipDetailSyncTasklet(), transactionManager)
|
||||
.build();
|
||||
}
|
||||
|
||||
/**
|
||||
* 3단계: 모든 스텝 성공 시 배치 실행 로그 업데이트
|
||||
*/
|
||||
@Bean
|
||||
public Tasklet shipDetailSyncLastExecutionUpdateTasklet() {
|
||||
return (contribution, chunkContext) -> {
|
||||
log.info(">>>>> 모든 테이블 동기화 성공: BATCH_LAST_EXECUTION 업데이트 시작");
|
||||
|
||||
jdbcTemplate.execute(getBatchUpdateSql());
|
||||
|
||||
log.info(">>>>> BATCH_LAST_EXECUTION 업데이트 완료");
|
||||
return RepeatStatus.FINISHED;
|
||||
};
|
||||
}
|
||||
|
||||
@Bean(name = "ShipDetailSyncLastExecutionUpdateStep")
|
||||
public Step shipDetailSyncLastExecutionUpdateStep() {
|
||||
return new StepBuilder("ShipDetailSyncLastExecutionUpdateStep", jobRepository)
|
||||
.tasklet(shipDetailSyncLastExecutionUpdateTasklet(), transactionManager)
|
||||
.build();
|
||||
}
|
||||
}
|
||||
불러오는 중...
Reference in New Issue
Block a user