2013-09-26 2 views
4

스프링 일괄을 사용하여 데이터베이스에 일부 개체를 만드는 배치를 실행하고 이러한 개체에서 파일을 만든 다음 FTP 서버로 파일을 보냅니다.스프링 배치 - 전체 작업에 대해 하나의 트랜잭션

따라서 2 단계가 있습니다. 하나는 DB에서 conf를 읽고 DB에 삽입하여 파일을 만듭니다. 두 번째는 파일을 FTP 서버로 보냅니다.

문제는 FTP 서버에 문제가있는 경우입니다. (DB에 새 삽입을 취소하기 위해) 트랜잭션을 롤백 할 수 없습니다.

어떻게하면 다른 단계에서 하나의 트랜잭션 만 사용하도록 내 작업을 구성 할 수 있습니까?

답변

2

이는 스프링 배치의 트랜잭션 특성으로 인해 좋지 않은 아이디어입니다.
IMHO 간단한 해결책은 작업이 시작될 때 생성되는 토큰으로 1 단계에서 저장된 데이터를 표시하고 FTP 업로드가 실패하면 정리 단계로 이동하여 토큰이있는 모든 데이터를 삭제하는 것입니다.

+0

감사 전송되지 않은 모든 항목을 제거한다 무엇 이건 : "로 갓 만든 개체를 표시 아직 보내지 않음 "플래그를 설정하고"FTP로 보내기 "단계가 성공적이면 변경하십시오. 또한 실패한 단계에서 일괄 처리를 다시 시작하는 코드 스 니펫을 갖도록 노력할 것입니다. – Zava

2

A는 bellabax와 동의합니다 : 이것은 나쁜 생각입니다.

그러나이 단계도 실패 할 수 있으므로 트랜잭션을 롤백 할 수 없으므로 세 번째 정리 단계를 수행하지 않을 것입니다.

항목이 아직 FTP로 전송되지 않았 음을 나타내는 플래그로 삽입 된 항목을 표시 할 수 있습니다. 세 번째 단계는 플래그를 전환하여 이러한 항목이 FTP로 전송되었음을 나타냅니다.

은 그럼 그냥 청소 크론/배치/4 필요 단계/그 그게 내 마지막 솔루션되었으며, FTP에

+0

우리는 같은 위험을 감수하고 있다고 생각합니다. 언제든지 정리 단계가 실패 할 수 있습니다. 그러나 실패한 단계에서 배치를 다시 시작할 수 있습니다. – Zava

+0

네 번째 단계는 필요하지 않습니다. 단순히 쿼리를 수행하는 크론이 될 수 있으며 부작용없이 실제로 다시 시작할 수 있습니다. –

+0

제 생각에는 정리 단계가 실패하더라도 문제가 아닙니다. . 왜냐하면 "아직 전송되지 않음"이라는 플래그가 지정된 개체는 사용하지 않기 때문입니다. – Zava

관련 문제