private static ChannelSftp channelSftp; channelSftp.ls(remoteDir);
타시스템에서 remoteDir에 파일을 upload하면,
sftp를 이용하여, 해당 파일접근하여 DB에 적재하는 배치인데,
타시스템에서 경로를 변경하여, 파일이 없어 Exception을 던졌으나,
캐모마일배치에선 COMPLETED로 나와서 문의 드립니다.
FAILED로 표시하려면 어떤 방법을 사용해야 하는지 문의 드립니다.
안녕하세요.
Step 내에서 예외가 상위로 던져져야 실제로 실패(Failed)로 처리됩니다.
Tasklet 을 통해 구성된 Job 의 경우, 명시적으로 RepeatStatue.FINISHED 를 던지도록 구성한 경우에도
실패하더라도 성공(Completed)로 기록이 됩니다.
확인하셔야 하는 부분은
- Error 로그로 찍는 부분 MemberService 에서 Catch 후 로그만 찍고, 예외를 위로 던지지 않고 직접 처리했는지
- 모든 조건에서 항상 RepeatStatus.FINISHED 를 반환하도록 작성되었는지
try { channelSftp.ls(remoteDir); } catch (SftpException e) { log.error("...", e); return RepeatStatus.FINISHED; // ← 이러면 Completed }
기본적으로 SftpException 을 메서드 밖으로 노출하기만 해도 실패로 기록이 됩니다.
다만, 예외의 원인이나 내용을 잘 파악하기 위해서는 직접적인 예외를 잡아서 별도 Exception 처리를 하는 것을 권장드립니다.
== 안전하게 Step 실패 처리를 하도록 하는 방법 (예외를 잡아서 다시 던지기)
catch (SftpException e) { // (선택) 명시적으로 실패 표시 contribution.setExitStatus(ExitStatus.FAILED); // 반드시 런타임 예외로 재던지기 throw new UnexpectedJobExecutionException("SFTP 실패: " + remoteDir, e); }
참고로 SftpException에는 상세 원인 코드가 들어옵니다.
– e.id == ChannelSftp.SSH_FX_NO_SUCH_FILE(= 2) → 경로/파일 없음
– e.id == ChannelSftp.SSH_FX_PERMISSION_DENIED(= 3) → 권한 문제
이 값을 로그에 포함하면 원인 파악이 빨라집니다.
== Tasklet 작성 예시
@Slf4j @Component public class SampleTasklet implements Tasklet { private final ChannelSftp channelSftp; private final String remoteDir = "/upload/not-exist"; // 일부러 잘못된 경로 public SampleTasklet(ChannelSftp channelSftp) { this.channelSftp = channelSftp; } @Override public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { try { log.info("Tasklet 실행! SFTP 경로 확인 시도: {}", remoteDir); // 존재하지 않는 경로일 경우 SftpException 발생 channelSftp.ls(remoteDir); log.info("SFTP 경로 [{}] 파일 조회 성공", remoteDir); return RepeatStatus.FINISHED; } catch (SftpException e) { log.error("SFTP 조회 실패 (경로: {}): {}", remoteDir, e.getMessage(), e); // StepExecution 상태를 FAILED 로 표시 contribution.setExitStatus(ExitStatus.FAILED); // 반드시 예외를 다시 던져야 Job/Step 이 FAILED 로 기록됨 throw new UnexpectedJobExecutionException("SFTP 처리 실패 (경로: " + remoteDir + ")", e); } } }
상세한 부분은 잡이 작성된 코드나 설정에 따라서 다를 수 있는 부분이라
추가적인 내용은 기술지원 담당자를 통해서 Webex 또는 메일로 요청부탁드립니다.
감사합니다.