복붙노트

[SPRING] Spring Batch : 다중 스레드로 변환 할 때의 문제 (데이터 혼합)

SPRING

Spring 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. ==============================

    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

    스레드 안전성은 복잡한 문제입니다. 단일 스레드 환경에서 작업하는 데 사용되는 코드에 여러 스레드를 추가하는 것은 일반적으로 코드의 문제를 발견하게됩니다.

  2. from https://stackoverflow.com/questions/28719836/spring-batch-problems-mix-data-when-converting-to-multithread by cc-by-sa and MIT license