스프링 배치에 문제가 있습니다. 작업에서 두 개의 병렬 단계 흐름을 처리하는 작업 실행자 (simpleAsyncTaskExecutor)를 사용하고 있습니다. 각 단계에서 스프링 배치 : 작업이 커밋 간격보다 적은 행으로 임의로 청크를 선택합니다.
가 작업 실행을 다른 스레드로 판독기에 의해 반환 된 데이터의 각각의 청크 분할 : 문제는 우리의 투입 간격이 큰 것을을 (멀티 스레드 단계 개념을 사용하여 https://docs.spring.io/spring-batch/trunk/reference/html/scalability.html 참조) (24,000), 독자가 반환 할 행 수가 매우 적습니다 (50 행 미만).하지만 작성자는 때때로 두 개 이상의 청크를 수신합니다 (예 : 30 행의 청크와 20 행의 청크, 다른 실행 25 행의 덩어리와 25 행의 덩어리 또는 50 행의 하나의 덩어리 일 수 있습니다. 임의의 실행에 대해 50 행의 청크 하나만 수신해야합니다 (무작위가 아니어야 함). 커밋 간격을 넘지 않습니다.
저는 왜 이것이 어떤 실행에서 무작위로 발생하는지 이해하려고합니다. 스프링 배치에서이 문제를 아는 사람이 있으면 도와 주시겠습니까?
감사합니다. 여기
는 (우리의 정의 작가 제외) 내 작업의 구성입니다 :<batch:job id="job">
<batch:split id="split" task-executor="taskExecutor">
<batch:flow>
<batch:step id="step1">
<batch:tasklet task-executor="taskExecutor" throttle-limit="4" >
<batch:chunk reader="reader1" writer="writer1" commit-interval="24000" />
</batch:tasklet>
</batch:step>
</batch:flow>
<batch:flow>
<batch:step id="step2">
<batch:tasklet task-executor="taskExecutor" throttle-limit="4" >
<batch:chunk reader="reader2" writer="writer2" commit-interval="24000" />
</batch:tasklet>
</batch:step>
</batch:flow>
</batch:split>
</batch:job>
<bean id="reader1" class="org.springframework.batch.item.database.JdbcPagingItemReader" scope="step">
<property name="dataSource" ref="postgresql_1" />
<property name="queryProvider">
<bean class="org.springframework.batch.item.database.support.PostgresPagingQueryProvider">
<property name="selectClause" value="
SELECT name
" />
<property name="fromClause" value="
FROM database.people
" />
<property name="whereClause" value="
WHERE age > 30
" />
<property name="sortKeys">
<map>
<entry key="people_id" value="ASCENDING"/>
</map>
</property>
</bean>
</property>
<property name="saveState" value="false" />
<property name="rowMapper">
<bean class="fr.myapp.PeopleRowMapper" />
</property>
</bean>
<bean id="reader2" class="org.springframework.batch.item.database.JdbcPagingItemReader" scope="step">
<property name="dataSource" ref="postgresql_1" />
<property name="queryProvider">
<bean class="org.springframework.batch.item.database.support.PostgresPagingQueryProvider">
<property name="selectClause" value="
SELECT product_name
" />
<property name="fromClause" value="
FROM database.products
" />
<property name="whereClause" value="
WHERE product_order_date <= '01/11/2017'
" />
<property name="sortKeys">
<map>
<entry key="product_id" value="ASCENDING"/>
</map>
</property>
</bean>
</property>
<property name="saveState" value="false" />
<property name="rowMapper">
<bean class="fr.myapp.ProductsRowMapper" />
</property>
</bean>
<bean id="taskExecutor" class="org.springframework.core.task.SimpleAsyncTaskExecutor">
<property name="concurrencyLimit" value="8" />
</bean>
안녕하세요 Joe 님의 답변에 감사드립니다. 내 게시물에서 말했듯이,이 동작은 무작위로 보입니다 (때로는 독자가 50 개의 작은 덩어리를 보내면 좋은 동작, 때로는 2 개의 작은 덩어리). 어딘가에 어딘가에있는 어떤 버그보다 어딘가에있는 버그 같아 보입니다. PersonRowMapper는 행을 올바른 PersonBean에만 맵핑합니다. 독자가 read()를 수행 한 후에 writer의 write() 메서드가 호출되면 writer는 2 개의 스레드에서 1 개의 청크 또는 2 개의 작은 청크를받습니다. – rBenks93