2013-06-19 4 views
0

스프링 배치에서 한 리더가 데이터를 읽고 그 데이터를 병렬로 실행하는 여러 작성자로 분할 할 수 있습니까?스프링 배치 하나의 리더 다중 작성자

단계 : 리더 : JdbcCursorItemReader는 100 개의 레코드를 읽고 10 병렬 작가 : 각 ItemWriter 프로세스에 10 개 개의 레코드를 가져옵니다.

CompositeItemWriter :

내가 검토 한 것으로 보인다 나는 작가에 고르게 항목을 분할해야 할 때 모든 작가에 대한 모든 읽기 항목을 전달합니다.

BackToBackPatternClassifier : 균등하게 항목을 나누어주기 때문에 구분자가 필요하지 않습니다.

하나의 리더와 여러 개의 작성자가있는 또 다른 방법이 있습니까?

아니면 직접 작성자에서 스레드를 만들 수 있습니까?

+1

아마도 Spring Integration을 믹스에 넣기를 원할 것입니다. 분리 작업을 10 개의 다른 인스턴스로 처리하는 것은 쉽고 간단합니다. 나중에 원할 경우 집계 할 수도 있습니다! –

답변

6

"다중 작성자"란 무엇을 의미합니까?

달성하려는 것은 다중 작성자가 아니라 다중 스레드가있는 단일 작성자입니다.

"다중 작성자"에 대해 이야기 할 때 독자는 청크를 읽고 청크에 대해 다른 종류의 "쓰기"를 수행해야한다는 것을 분명히합니다. 예 : 당신은 어딘가에서 Player를 읽는 PlayerRecordReader를 가질 수 있고, DB와 File에 쓰는 PlayerDbWriter와 PlayerFileWriter를 가질 수 있습니다. 여러 작성자는로드를 분배하지 않습니다.

필기를 병렬로 수행하려는 경우 필요한 것은 단일 작성자 (물론 스레드로부터 안전하게해야 함)이며 단계 정의에서 실행 프로그램을 사용하는 것입니다. Spring Batch의이 페이지는 어떻게 수행하는지에 대한 명확한 지시를 제공합니다. http://static.springsource.org/spring-batch/reference/html/scalability.html#multithreadedStep

+0

그래, 그게 내가 여러 스레드를 의미. 죄송합니다! 여기에는 멀티 스레드 단계 (리더 및 라이터)가 있으며 라이터에만 국한되지는 않습니다. 나는 독자를 1이라고 부르기 바란다. 필자는 Writer 클래스에서 Runnable (Thread) 클래스의 Writer 논리를 호출하여이 작업을 수행하기로했습니다. 답장을 보내 주셔서 감사합니다 :) – hajime

+1

그게 무슨 뜻이야? 하나의 청크가 읽히기를 원하고 동일한 청크가 동시에 여러 번 처리되기를 원하십니까? 하지만 왜? 나는 당신이하고있는 일을 다시 생각해 보길 강력히 권합니다. 나는 그것을하는 더 솔직한 방법이 있다고 믿습니다. –

0

나는 Writer 로직을 Runnable 클래스 (Thread 클래스)로 옮겼다. MyWriterRunnable이라고하고 MyWriter 클래스에서는 수동으로 항목 목록을 10 개의 배치로 분할하고 각 배치마다 MyWriterRunnable을 호출하고있다.

+1

나는 Runnable 대신 callable 인터페이스를 사용할 것이다. write() 메소드에서 Throws Exception을 유지하기를 원하기 때문입니다. 당신이> 자바 6 물론 사용하는 경우! – Cygnusx1

+1

당신이하고있는 방식이 문제를 일으킬 것입니다.이 특별한 경우에는 효과가 있지만 길로 여겨서는 안됩니다. 가장 큰 문제는 작성자 로직이 해당 리더/프로세서 로직과 동일한 트랜잭션하에 있지 않다는 것입니다. 그것은 문제를 일으킬 것입니다. TaskExecutor를 사용하여 Spring Batch 빌트인 솔루션을 채택하십시오. –

+0

@AdrianShum TaskExecutor는 청크 용이므로 리더와 작성기는 모두 Taskexecutor 스레드에서 실행됩니다. 필자가 원하는 것은 100 명의 읽기 레코드를 1 명의 독자가 서로 평행하게 쓰고, 1 명의 작가의 아래에서 새로운 스레드를 실행하고 있기 때문에 1 개의 트랜잭션 바로 아래에있게 될 것입니다. – hajime

0

데이터를 병렬로 처리하려는 경우 데이터를 분할하고 연결된 단계에 청크를 지정해야합니다. 파티션은 스레드 당 읽을 대상을 결정하는 것처럼 간단 할 수도 있고 이전 단계에서 이미 읽은 데이터를 취하여 균등하게 분산 된 청크로 분할하여 각 스레드의 각 판독기에 처리하도록 청크를 할당 할 수도 있습니다.

관련 문제