다음과 같이 Spring Batch 작업을 작성해야합니다.
(그 직업 구조에 대한 의견은 환영하지만 질문은 아닙니다).
1 단계에서 XML 파일을로드 한 후 다른 디렉터리로 이동하려고합니다. 가능한 한 스테이징 테이블에 대한 쓰기와 함께 "트랜잭션"이되기를 바랍니다. 즉, 스테이징에 대한 쓰기와 파일 이동이 모두 성공하거나 성공하지 않습니다.
(A) 스테이징 쓰기가 발생했지만 파일이 이동하지 않으면 다음 실행에서 파일을 다시 선택하여 다시 처리하고 (B) 파일이 이동되었지만 스테이징 쓰기가 발생하지 않으면 이것이 필요하다고 생각합니다. 그러면 해당 파일의 처리를 놓쳤을 것입니다.
이 인터페이스의 요구 사항은 모두 견고성 에 관한 것 입니다. 마지막에 모든 파일을 이동하기 위해 단계 실행 리스너를 넣을 수 있다는 것을 알고 있지만 처리 데이터를 놓치지 않고 동일한 파일을 두 번 처리하지 않도록 보장하는 접근 방식을 원합니다.
어려움의 일부는 MultiResourceItemReader
. ChunkListener.beforeChunk()
청크 트랜잭션의 일부로 발생 하는 것을 읽었 으므로 CompletionPolicy
리소스 (파일) 이름이 변경 될 때마다 청크를 완료하도록 사용자 지정 청크를 만들려고했지만 작동하지 못했습니다. afterChunk()
어쨌든 트랜잭션의 일부가 아닌 리스너 가 필요했을 것 입니다.
특정 질문에 대한 지침을 받거나 Spring Batch에서 파일을 강력하게 처리하는 방법에 대한 전문가의 설명을 듣겠습니다. 감사!
나는 지금 꽤 비슷한 봄 배치 프로세스를 가지고 있습니다.
스프링 배치는 귀하의 요구 사항에 적합합니다.
여기에서 봄 통합을 사용하는 것이 좋습니다. 스프링 통합에서는 폴더를 모니터링하도록 구성한 다음 배치 작업을 트리거하도록 구성 할 수 있습니다. 공식 문서 에는 좋은 예가 있습니다 .
그런 다음 강력한 스프링 배치 개념 (파라미터 식별)을 사용해야합니다. 스프링 배치 작업은 고유 한 매개 변수로 실행되며이 매개 변수를 식별로 지정하면 동일한 매개 변수로 다른 작업을 생성 할 수 없습니다 (원래 작업을 다시 시작할 수 있음).
/**
* Add a new String parameter for the given key.
*
* @param key - parameter accessor.
* @param parameter - runtime parameter
* @param identifying - indicates if the parameter is used as part of identifying a job instance
* @return a reference to this object.
*/
public JobParametersBuilder addString(String key, String parameter, boolean identifying) {
parameterMap.put(key, new JobParameter(parameter, identifying));
return this;
}
따라서 여기서 배치 작업에 대한 고유 식별 제약이 무엇인지 자문 해보아야합니다. 전체 파일 경로를 제안합니다. 하지만 그 누구도 동일한 파일 이름을 가진 다른 파일을 제공하지 않도록해야합니다. 또한 Spring 통합은 파일이 이미 응용 프로그램에 표시되었는지 확인하고 무시할 수 있습니다. AcceptOnceFileListFilter에 대한 설명서를 확인하십시오 .
'트랜잭션과 유사한'로직을 일괄 적으로 보장하려면 리스너에 넣지 말고 파일을 이동할 특정 단계를 만듭니다. 청취자는 보조 논리에 좋습니다. 이런 식으로 어떤 이유로이 단계가 실패하더라도 문제를 해결하고 작업을 다시 시도 할 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다