From c2d4d3a5f0ba5bf528661627e53f3b65a8a7151b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?dean=5B=EB=B0=B1=EB=B3=91=EB=82=A8=5D?= Date: Mon, 9 Feb 2026 20:52:41 +0900 Subject: [PATCH] Split the function --- .../libs/generator-dataset-for-training.jar | Bin 19806638 -> 19807239 bytes .../batch/LaunchChildJobsTasklet.java | 76 ++++++++++++------ 2 files changed, 51 insertions(+), 25 deletions(-) diff --git a/kamco-make-dataset-generation/build/libs/generator-dataset-for-training.jar b/kamco-make-dataset-generation/build/libs/generator-dataset-for-training.jar index 52ec8f2051dd6906bb288b983c40313a1f068590..347b389606f8386c0b14b76aa4bb83fe75bc37fb 100644 GIT binary patch delta 8524 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 V|F_WMBXR?#36L=^N?=Gx{tu-KuKNH0 delta 7988 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 EA3pBF$N&HU diff --git a/kamco-make-dataset-generation/src/main/java/com/kamco/cd/geojsonscheduler/batch/LaunchChildJobsTasklet.java b/kamco-make-dataset-generation/src/main/java/com/kamco/cd/geojsonscheduler/batch/LaunchChildJobsTasklet.java index d29e2ef..c12f6d9 100644 --- a/kamco-make-dataset-generation/src/main/java/com/kamco/cd/geojsonscheduler/batch/LaunchChildJobsTasklet.java +++ b/kamco-make-dataset-generation/src/main/java/com/kamco/cd/geojsonscheduler/batch/LaunchChildJobsTasklet.java @@ -18,35 +18,44 @@ import org.springframework.batch.core.step.tasklet.Tasklet; import org.springframework.batch.repeat.RepeatStatus; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.TransactionDefinition; +import org.springframework.transaction.support.DefaultTransactionDefinition; +import org.springframework.transaction.support.TransactionTemplate; /** * Child Job 실행 Tasklet (Parent Job용) * - *

진행 중인 모든 분석 회차(AnalCntInfo)를 조회하여 각 회차마다 독립적인 Child Job을 실행합니다. 각 Child Job은 3개의 + *

+ * 진행 중인 모든 분석 회차(AnalCntInfo)를 조회하여 각 회차마다 독립적인 Child Job을 실행합니다. 각 Child Job은 + * 3개의 * Step(makeGeoJson → dockerRun → zipResponse)을 순차적으로 실행합니다. * - *

주요 기능: + *

+ * 주요 기능: * *

    - *
  • 진행 중인 분석 회차 목록 조회 (tb_map_sheet_anal_inference, anal_state='ING') - *
  • 각 회차별 처리 필요 여부 판단 (all_cnt != file_cnt) - *
  • 회차마다 Child Job(processAnalCntInfoJob) 실행 - *
  • 부분 실패 허용 (한 회차 실패해도 다른 회차 계속 처리) + *
  • 진행 중인 분석 회차 목록 조회 (tb_map_sheet_anal_inference, anal_state='ING') + *
  • 각 회차별 처리 필요 여부 판단 (all_cnt != file_cnt) + *
  • 회차마다 Child Job(processAnalCntInfoJob) 실행 + *
  • 부분 실패 허용 (한 회차 실패해도 다른 회차 계속 처리) *
* - *

실행 조건: + *

+ * 실행 조건: * *

    - *
  • tb_map_sheet_anal_inference.anal_state = 'ING' (진행 중) - *
  • 검수 완료 건수(complete_cnt) > 0 - *
  • all_cnt != file_cnt (아직 파일 생성이 완료되지 않음) + *
  • tb_map_sheet_anal_inference.anal_state = 'ING' (진행 중) + *
  • 검수 완료 건수(complete_cnt) > 0 + *
  • all_cnt != file_cnt (아직 파일 생성이 완료되지 않음) *
* - *

실패 정책: + *

+ * 실패 정책: * *

    - *
  • 현재: 부분 실패 허용 (일부 Child Job 실패해도 Parent Job 성공) - *
  • 변경 가능: 87-89라인 주석 해제 시 하나라도 실패하면 Parent Job 실패 + *
  • 현재: 부분 실패 허용 (일부 Child Job 실패해도 Parent Job 성공) + *
  • 변경 가능: 87-89라인 주석 해제 시 하나라도 실패하면 Parent Job 실패 *
* * @author KAMCO Development Team @@ -69,10 +78,15 @@ public class LaunchChildJobsTasklet implements Tasklet { @Qualifier("processAnalCntInfoJob") private final Job processAnalCntInfoJob; + /** 트랜잭션 매니저 (트랜잭션 제어용) */ + private final PlatformTransactionManager transactionManager; + /** * Parent Job의 메인 로직 실행 * - *

진행 중인 모든 분석 회차를 조회하여 각 회차마다 Child Job을 실행합니다. 한 회차가 실패해도 다른 회차는 계속 처리되며, 최종적으로 통계를 + *

+ * 진행 중인 모든 분석 회차를 조회하여 각 회차마다 Child Job을 실행합니다. 한 회차가 실패해도 다른 회차는 계속 처리되며, + * 최종적으로 통계를 * 로깅합니다. * * @param contribution Step 실행 정보를 담는 객체 @@ -133,12 +147,11 @@ public class LaunchChildJobsTasklet implements Tasklet { try { // Child Job Parameters 생성 - JobParameters jobParameters = - new JobParametersBuilder() - .addLong("analUid", info.getAnalUid()) - .addString("resultUid", info.getResultUid()) - .addLong("timestamp", System.currentTimeMillis()) // JobInstance 고유성 보장 - .toJobParameters(); + JobParameters jobParameters = new JobParametersBuilder() + .addLong("analUid", info.getAnalUid()) + .addString("resultUid", info.getResultUid()) + .addLong("timestamp", System.currentTimeMillis()) // JobInstance 고유성 보장 + .toJobParameters(); log.info("[Child Job 실행] processAnalCntInfoJob 시작..."); log.info(" - JobParameters: analUid={}, resultUid={}", info.getAnalUid(), @@ -148,7 +161,21 @@ public class LaunchChildJobsTasklet implements Tasklet { // asyncJobLauncher를 사용하여 별도 쓰레드에서 실행 // 내부적으로 makeGeoJsonStep → dockerRunStep → zipResponseStep 순차 실행 long startTime = System.currentTimeMillis(); - JobExecution jobExecution = asyncJobLauncher.run(processAnalCntInfoJob, jobParameters); + + // 트랜잭션 일시 정지 후 실행 (Existing transaction detected 에러 방지) + JobExecution jobExecution = new TransactionTemplate(transactionManager, + new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_NOT_SUPPORTED)) + .execute(status -> { + try { + return asyncJobLauncher.run(processAnalCntInfoJob, jobParameters); + } catch (Exception e) { + throw new RuntimeException(e); + } + }); + + if (jobExecution == null) { + throw new RuntimeException("JobExecution is null after launching child job"); + } // Child Job 완료 대기 (비동기 실행이므로 완료를 폴링) log.info("[Child Job 대기] 실행 완료 대기 중... (JobExecutionId={})", @@ -222,8 +249,7 @@ public class LaunchChildJobsTasklet implements Tasklet { // 성공률 계산 if (analList.size() > 0) { - double successRate = - (double) processedCount / (analList.size() - skippedCount) * 100; + double successRate = (double) processedCount / (analList.size() - skippedCount) * 100; log.info(" - 성공률: {}% (건너뛴 회차 제외)", String.format("%.2f", successRate)); } @@ -239,8 +265,8 @@ public class LaunchChildJobsTasklet implements Tasklet { // 실패가 있어도 Parent Job은 성공으로 처리 (부분 성공 정책) // 만약 하나라도 실패하면 Parent Job도 실패로 처리하려면 아래 주석 해제 // throw new RuntimeException( - // String.format("%d 개의 Child Job 실행이 실패했습니다. (성공: %d, 실패: %d)", - // failedCount, processedCount, failedCount)); + // String.format("%d 개의 Child Job 실행이 실패했습니다. (성공: %d, 실패: %d)", + // failedCount, processedCount, failedCount)); } else { log.info("[완료] 모든 Child Job이 정상적으로 완료되었습니다."); }