2017-02-16 1 views
4

TaskExecutor과 함께 FlatFileItemReader을 사용하는 많은 예제가 있습니다. 나는 (두 XML 및 Java 구성으로) 아래 샘플을 제공 : 나는 데이터베이스에 XML의 큰 CSV를위한 구성 (GB 크기) 쓰기와 함께 내 자신을 사용했다TaskExecutor와 함께 FlatFileItemReader 사용 (스레드 안전성)

즉시 사용 가능한 상자 JpaItemWriter. save-state = false를 설정하거나 특별한 처리를하지 않아도 아무런 문제가없는 것 같습니다.

이제 FlatFileItemReader은 thread-safe이 아니므로 으로 기록됩니다.

내 생각 엔 JpaItemWriter가 엔터티의 비즈니스 키를 커버했다 hashCode()equals() 경우 중복 불가능으로 설정 즉 컬렉션을 지속하여 문제를 "포함하는"것을이었다. 그러나이 방법조차도 스레드가 안전하지 않은 읽기 및 처리로 인해 중복을 방지하기에는 충분하지 않습니다.

TaskExecutor를 지정한 Tasklet 내에 즉시 사용 가능한 FlatFileItemReader을 사용하는 것이 올바른지/정확하고 안전합니까? 관계없이 작가. 그렇지 않다면, 우리는 어떻게 JPAItemWriter이 사용될 때 이론적으로 오류의 부족을 설명 할 수 있습니까?

PS : I 상기 수득 예 링크가 모든 가능한 스레드 안전성 문제에 언급없이 TaskExecutor를 가진 FlatFileItemReader 사용 ...

+0

'FlatFileItemReader'가 아닌 경우'JpaItemWriter'가 스레드로부터 안전하다는 것을 묻는 중입니까? – CKing

+0

제 질문이 좀 더 일반적입니다. FlatFileItemReader가 TaskExecutor 및 다른 Writer와 함께 스레드 안전을위한 특별한 처리없이 사용되는 2 개의 링크를 제공합니다. 또한 나는 내 자신의 경험을 제공하고 JpaItemWriter가 어떤 상황에서 문제를 "숨길"수있는 방법에 대한 이론적 설명을하려고했습니다. 즉, 우리가 올바르게 사용하는 방법과 마침내 TaskExecutor를 그대로 사용할 수 있는지에 관한 질문입니다. – kmandalas

+0

'JpaItemReader' 또는'JpaItemWriter'를 의미합니까? –

답변

3

TL; DR 설치된 TaskExecutorFlatFileItemReader를 안전하게 사용할 Writer은 스레드로부터 안전합니다. (작업을 다시 시작하고, 단계를 다시 시도하고 건너 뛰는 것과 관련이 없다고 가정 할 때).

업데이트 : 이제 공식적으로 saveState 필요가 (즉 재가 해제) 한 스레드 안전한 방식으로 TaskExecutorFlatFileItemReader를 사용하고자하는 경우 false로 설정할 수 있음을 확인하는 JIRA 있습니다.


하자 먼저 Spring documentationTaskExecutor와 멀티 스레드 단계를 사용하는 방법에 대한 말씀을보고하여 말의 입에서 듣고.

스프링 배치는 ItemWriter 및 ItemReader의 일부 구현을 제공합니다. 대개 그들은 Javadocs에서 thread safe 인 경우 인지 여부 또는 동시에 환경에서 문제를 피하기 위해해야 ​​할 일이 무엇인지 말합니다.

당신이 명확히 주 시겠어요 : Javadoc과의 정보가없는 경우, 당신은

이의 지금 질문을 해결하자 어떤 상태가 있는지 확인하기 위해 구현을 확인할 수 있습니다 그것은 적절한입니다/정확/ TaskExecutor를 에 할당 한 Tasklet 내에 즉시 사용 가능한 FlatFileItemReader를 사용하는 것이 안전합니까?관계없이 작가. 그렇지 않다면 우리는 JPAItemWriter가 사용되었을 때 이론상 오류가 없다는 것을 어떻게 설명 할 수 있습니까?

"작가의 동의"문구는 올바르지 않습니다. Writer은 스레드로부터 안전해야합니다. JpaItemWriterJava 문서에 대한 스레드 안전을 보장하며 스레드로부터 안전하지 않은 FlatFileItemReader으로 안전하게 사용할 수 있습니다. JpaItemWriter이 스레드로부터 안전하다는 것을 설명하면이 대답을 오래 할 수 있습니다. 특정 작성자가 스레드 안전을 처리하는 방법에 관심이 있다면 다른 질문을 게시하는 것이 좋습니다. 합니다 (스프링 배치에서 언급 한 바와 같이 문서뿐만 아니라)

PS : 나는 위의 줄 예제 링크가 가능한 모든 스레드 안전 문제에 언급하지 않고 된 TaskExecutor와 FlatFileItemReader를 사용 ..

일관성 예제를 살펴보면 CoherenceBatchWriter.java그림 6으로 명확하게 수정 한 것을 볼 수 있습니다. 먼저 mapBatch 로컬 변수를 만들어 여러 스레드가이 Map의 고유 한 복사본을 갖도록합니다. 또한, Coherence API를 더 자세히 살펴보면 NamedCache이 스레드로부터 안전함을 알 수 있습니다.

Writer은 경쟁 조건을 피하기 위해 아무 것도하지 않으므로 제공하는 두 번째 링크는 실제로 위험합니다. 이 예제는 실제로 멀티 스레드 단계의 잘못된 사용입니다.


+0

제공된 모든 정보를 제공해 주셔서 감사합니다. 그러나 청크 지향 처리 스타일을 감안할 때'FlatFileItemReader'가 스레드로부터 안전하지 않다면 다른 스레드가 파일의 동일한 행을 읽을 수 없습니까? 이렇게하면 Writer는 스레드로부터 안전하다고하더라도 최종적으로 중복 항목을 쓰려고 시도합니다. 이것이 내가 라이터 부분에 중점을 두지 않은 이유입니다. – kmandalas

+0

@kmandalas 가능합니다.하지만 작성자가 스레드로부터 안전 할 경우이 문제는 무효화되므로 결국 모든 것이 잘 처리됩니다. * Cohernece *에 대한 Writer 구현을 살펴 본다면 작성자가 쓰레드에 안전한'Map'과'Map'에 쓰는 중복 된 쓰기가 없다는 것을 알 수 있습니다. 중복 키 허용. 또한,'JpaItemWriter'는 thread-safe이며, IMO 중복을 피하기위한 동일한 격리를 제공합니다. 그래서 작가는 비록 당신이 그것에 강조하지 않더라도 중요합니다. – CKing