diff --git a/src/main/java/com/kamco/cd/kamcoback/inference/InferenceResultApiController.java b/src/main/java/com/kamco/cd/kamcoback/inference/InferenceResultApiController.java index 68945322..bd3abffd 100644 --- a/src/main/java/com/kamco/cd/kamcoback/inference/InferenceResultApiController.java +++ b/src/main/java/com/kamco/cd/kamcoback/inference/InferenceResultApiController.java @@ -176,7 +176,8 @@ public class InferenceResultApiController { }) @DeleteMapping("/end") public ApiResponseDto getInferenceGeomList() { - UUID uuid = inferenceResultService.deleteInferenceEnd(); + // UUID uuid = inferenceResultService.deleteInferenceEnd(); + UUID uuid = inferenceResultService.asyncInferenceEnd(); return ApiResponseDto.ok(uuid); } diff --git a/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto.java b/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto.java index 2f9fe957..d6f3ec1e 100644 --- a/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto.java +++ b/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto.java @@ -87,6 +87,7 @@ public class InferenceResultDto { READY("대기"), IN_PROGRESS("진행중"), END("완료"), + END_FAIL("종료실패"), FORCED_END("강제종료"); private final String desc; @@ -683,6 +684,7 @@ public class InferenceResultDto { @NoArgsConstructor @AllArgsConstructor public static class MapSheetFallbackYearDto { + private String mapSheetNum; private Integer mngYyyy; } diff --git a/src/main/java/com/kamco/cd/kamcoback/inference/service/InferenceResultService.java b/src/main/java/com/kamco/cd/kamcoback/inference/service/InferenceResultService.java index 5bb80056..9b7e5a29 100644 --- a/src/main/java/com/kamco/cd/kamcoback/inference/service/InferenceResultService.java +++ b/src/main/java/com/kamco/cd/kamcoback/inference/service/InferenceResultService.java @@ -63,6 +63,7 @@ import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -1033,4 +1034,63 @@ public class InferenceResultService { } return ""; } + + // 0313 + @Transactional + public UUID asyncInferenceEnd() { + SaveInferenceAiDto dto = inferenceResultCoreService.getProcessing(); + if (dto == null) { + throw new CustomApiException("NOT_FOUND", HttpStatus.NOT_FOUND); + } + + this.deleteInferenceEndAsync(dto); // 비동기 종료 호출 + + return dto.getUuid(); + } + + // 0313 + @Async("inferenceEndExecutor") + @Transactional + public void deleteInferenceEndAsync(SaveInferenceAiDto dto) { + Long batchId = dto.getBatchId(); + String url = batchUrl + "/" + batchId; + + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + headers.setAccept(List.of(MediaType.APPLICATION_JSON)); + + try { + log.info("[추론 종료 비동기 시작] uuid={}, batchId={}", dto.getUuid(), batchId); + + ExternalCallResult result = + externalHttpClient.callLong(url, HttpMethod.DELETE, dto, headers, String.class); + + if (!result.success()) { + log.error("[추론 종료 실패] 외부 API 호출 실패. uuid={}, batchId={}", dto.getUuid(), batchId); + + SaveInferenceAiDto failRequest = new SaveInferenceAiDto(); + failRequest.setUuid(dto.getUuid()); + failRequest.setStatus(Status.END_FAIL.getId()); // TODO: 종료실패 상태 추가하는 게 맞는지? + failRequest.setUpdateUid(userUtil.getId()); + failRequest.setInferEndDttm(ZonedDateTime.now()); + inferenceResultCoreService.update(failRequest); + return; + } + + SaveInferenceAiDto request = new SaveInferenceAiDto(); + request.setStatus(Status.FORCED_END.getId()); + request.setUuid(dto.getUuid()); + request.setUpdateUid(userUtil.getId()); + request.setInferEndDttm(ZonedDateTime.now()); + inferenceResultCoreService.update(request); + + Long learnId = inferenceResultCoreService.getInferenceLearnIdByUuid(dto.getUuid()); + inferenceResultCoreService.upsertGeomData(learnId); + + log.info("[추론 종료 비동기 완료] uuid={}, batchId={}", dto.getUuid(), batchId); + + } catch (Exception e) { + log.error("[추론 종료 비동기 예외] uuid={}, batchId={}", dto.getUuid(), batchId, e); + } + } } diff --git a/src/main/java/com/kamco/cd/kamcoback/scheduler/config/AsyncConfig.java b/src/main/java/com/kamco/cd/kamcoback/scheduler/config/AsyncConfig.java index 19edd262..762a80ff 100644 --- a/src/main/java/com/kamco/cd/kamcoback/scheduler/config/AsyncConfig.java +++ b/src/main/java/com/kamco/cd/kamcoback/scheduler/config/AsyncConfig.java @@ -42,4 +42,16 @@ public class AsyncConfig { exec.initialize(); return exec; } + + // 0313 + @Bean(name = "inferenceEndExecutor") + public Executor inferenceEndExecutor() { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(5); + executor.setMaxPoolSize(10); + executor.setQueueCapacity(100); + executor.setThreadNamePrefix("inference-async-"); + executor.initialize(); + return executor; + } }