[SPRING] Spring Batch : 다중 스레드로 변환 할 때의 문제 (데이터 혼합)
SPRINGSpring Batch : 다중 스레드로 변환 할 때의 문제 (데이터 혼합)
어쩌면 이것은 반복되는 질문 일 수도 있지만 내 상황에 맞는 사용자 정의가 필요합니다.
Spring Batch 3.0.1을 사용하고 있습니다.
몇 가지 단계가있는 간단한 직업이 있습니다. 한 단계는 다음과 같은 청크입니다.
<tasklet transaction-manager="myTransactionManager">
<batch:chunk reader="myReader" processor="myProcessor" writer="myWriter" commit-interval="${commit.interval}">
</batch:chunk>
<bean id="myProcessor" class="org.springframework.batch.item.support.CompositeItemProcessor" scope="step">
<property name="delegates">
<list>
<bean class="...MyFirstProcessor">
</bean>
<bean class="...MySecondProcessor">
</bean>
</list>
</property>
이 구성을 사용하면 제 직업이 완벽하게 작동합니다.
자, 이것을 다중 스레드 작업으로 변환하고 싶습니다. 기본 다중 스레드 작업에 대한 설명서를 읽은 후 작업 표에 SympleAsyncTaskExecutor를 포함 시켰지만 실패했습니다.
JdbcCursorItemReader가 멀티 스레드 실행에서 제대로 작동하지 않는다는 것을 읽었습니다 (맞습니까?). 나는 독자를 JdbcPagingItemReader로 바꾸었고, 악몽이었다. 작업은 실패하지 않으며, 쓰기 프로세스는 괜찮지 만 데이터는 스레드간에 혼합되어 있으며 고객 데이터는 정확하고 일관성이 없다 (고객은 서비스, 주소, 등).
그래서, 왜 그렇게됩니까? 멀티 쓰레드 작업으로 어떻게 바꿀 수 있습니까?
나는 매우 잠겨있어 혼란스럽고, 어떤 도움을 주시면 감사하겠습니다. 고마워.
[수정 - 적용]
글쎄, 내 문제에 대한 적절한 수정은 처음부터 다중 스레드 및 스레드 안전 실행을위한 작업을 설계하는 것입니다. 스프링 배치 (Spring Batch) 개념을 이해하고 파악하기 위해서는 먼저 하나의 스레드 단계 실행으로 연습하는 것이 바람직합니다. 이 단계를 뒤로하고 있다고 생각한다면, 변경 불가능한 객체, thread-safe list, map 등의 고려 사항을 제기해야합니다.
현재 문제의 현재 상태에 대한 수정 사항은 나중에 설명 할 내용입니다. Martine의 제안을 테스트하고 Michael의 가이드 라인을 고려한 결과 마침내 가능한 한 내 문제를 해결했습니다. 다음 단계는 좋은 습관이 아니지만 나는 처음부터 직장을 재건 할 수 없었다.
따라서 위임 된 bean이 다음과 같을 경우 :
<bean class="...MyProcessor">
<property name="otherBean" ref="otherBeanID" />
로 변경:
<bean class="...MyProcessor">
<property name="otherBean" value="otherBeanID" />
그리고 MyProcessor 내에서 컨텍스트에서 otherBeanID에 대한 단일 인스턴스를 가져옵니다. otherBeanID는 scope = "protoype"으로 구성되어야합니다.
전에 말했듯이, 그들은 좋은 스타일이 아니지만 최선의 선택이었습니다. 각 스레드마다 자체적 인 항목 인스턴스와 다른 bean 인스턴스가 있다고 주장 할 수 있습니다.
일부 클래스는 올바른 멀티 스레드 실행을 위해 잘 설계되지 않았 음을 증명합니다.
마틴, 마이클, 도와 줘서 고마워.
누구에게나 도움이되기를 바랍니다.
해결법
-
==============================
1.귀하는 귀하의 질문에 많은 것을 부탁했습니다. (미래에 이런 유형의 질문을 여러 가지 더 구체적인 질문으로 나누십시오.) 그러나 항목 별 항목 :
귀하는 귀하의 질문에 많은 것을 부탁했습니다. (미래에 이런 유형의 질문을 여러 가지 더 구체적인 질문으로 나누십시오.) 그러나 항목 별 항목 :
JdbcCursorItemReader는 쓰레드에 안전한가요? 문서에 나와 있듯이 그렇지 않습니다. 그 이유는 JdbcCursorItemReader가 스레드 안전하지 않은 단일 ResultSet을 랩핑하기 때문입니다.
복합 프로세서 및 작성기가 멀티 스레드에 적합합니까? Spring Batch에서 제공하는 CompositeItemProcessor는 델리게이트 ItemProcessor 구현이 스레드 안전 인 한 스레드 세이프로 간주됩니다. 구현이나 구성과 관련하여 코드를 제공하지 않으므로 스레드 안전성을 확인할 수 없습니다. 그러나 설명하는 증상을 감안할 때 내 직감은 코드 내에서 진행되는 스레드 안전 문제가 있다는 것입니다.
또한 어떤 ItemWriter 구현이나 사용중인 구성을 식별하지 않으므로 거기에 스레드 관련 문제가있을 수도 있습니다.
구현 및 구성에 대한 자세한 정보로 질문을 업데이트하면 더 많은 통찰력을 제공 할 수 있습니다.
어떻게 사용자 정의 스레드 안전 합성 프로세서를 만들 수 있습니까? ItemProcessor를 구현할 때 고려해야 할 두 가지 사항이 있습니다.
어쩌면 JDBC 독자가 될 수 있을까요? 다중 스레드 용 스레드 안전 JDBC 판독기가 있습니까? 이전에 언급했듯이 JdbcPaginingItemReader는 스레드로부터 안전하며 설명서에서 이와 같이 명시되어 있습니다. 여러 스레드를 사용할 때 각 청크는 자체 스레드에서 실행됩니다. 커밋 간격과 일치하도록 페이지 크기를 구성하면 각 페이지가 동일한 스레드에서 처리됨을 의미합니다.
단일 단계 확장을위한 기타 옵션 단일, 다중 스레드 단계 구현의 길을 걷는 동안 더 나은 옵션이있을 수 있습니다. Spring Batch는 5 가지 핵심 확장 옵션을 제공합니다.
Spring Batch에 대한 문서에서 다음 옵션을 모두 읽을 수 있습니다. http://docs.spring.io/spring-batch/trunk/reference/html/scalability.html
스레드 안전성은 복잡한 문제입니다. 단일 스레드 환경에서 작업하는 데 사용되는 코드에 여러 스레드를 추가하는 것은 일반적으로 코드의 문제를 발견하게됩니다.
from https://stackoverflow.com/questions/28719836/spring-batch-problems-mix-data-when-converting-to-multithread by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Hibernate (4.1.2) 및 Spring (3.1.2) - ManyToMany 관계는 JoinTable에 레코드를 저장하지 않습니다. (0) | 2019.04.02 |
---|---|
[SPRING] 필터가있는 Spring 데이터 ElasticSearch 집계 (0) | 2019.04.02 |
[SPRING] 여분의 many-to-many 테이블을 생성하는 Hibernate (0) | 2019.04.02 |
[SPRING] Spring을 사용하여 개발하는 동안 모든 인증서를 신뢰해야합니다. (0) | 2019.04.02 |
[SPRING] 봄 보안 인증 로그인에서 사용자 이름과 비밀번호의 사용자 입력 값을 얻는 방법 (0) | 2019.04.02 |