Spring batch spring批处理中的并行步骤执行

Spring batch spring批处理中的并行步骤执行,spring-batch,Spring Batch,现在我知道我们可以使用并行步骤(7.2)在spring批处理中运行并发步骤。我做到了,并获得了成功。 但是,当我看到数据库时,表中的person记录被更新为其他人的person信息,尽管我已经将ItemProcessor设置为同步。 这项工作的背景很简单,只需处理跨部门人员表(200400)中的人员记录,并将其写入平面文件。 当我看到平面文件时,我可以看到200部门的一个人的记录,上面写着400部门的人的信息。我需要帮忙吗 <batch:job id="dept"> <

现在我知道我们可以使用并行步骤(7.2)在spring批处理中运行并发步骤。我做到了,并获得了成功。 但是,当我看到数据库时,表中的person记录被更新为其他人的person信息,尽管我已经将ItemProcessor设置为同步。 这项工作的背景很简单,只需处理跨部门人员表(200400)中的人员记录,并将其写入平面文件。 当我看到平面文件时,我可以看到200部门的一个人的记录,上面写着400部门的人的信息。我需要帮忙吗

<batch:job id="dept">
    <batch:step id="dojStep1" parent="dojMainStep1" next="parallelProcessMatch">
    </batch:step>
    <batch:split id="parallelProcessMatch" task-executor="taskExecutor">
        <batch:flow>
            <batch:step id="step200" parent="dojMainStep200" >
            </batch:step>
        </batch:flow>
        <batch:flow>
            <batch:step id="step400" parent="dojMainStep400" >
            </batch:step>
        </batch:flow>
    </batch:split>
</batch:job>

<bean id="taskExecutor" class="org.springframework.core.task.SimpleAsyncTaskExecutor"/>


<!-- Start parallelProcessMatch -->
<!-- Start dojMainStep200 -->
<batch:step id="dojMainStep200" abstract="true">
    <batch:tasklet>
        <batch:chunk commit-interval="1000" reader="dojDbReader200"
            processor="dojMatchItemProcessor200" writer="dojClassifierMatchReportWriter200">
            <batch:streams>
                <batch:stream ref="itemWriterMatch200" />
                <batch:stream ref="itemWriterUnMatch200" />
            </batch:streams>
        </batch:chunk>
    </batch:tasklet>
    <batch:listeners>
        <batch:listener ref="dojMatch200PageHeaderCallback" />
        <batch:listener ref="dojUnMatch200PageHeaderCallback" />
        <batch:listener ref="dojInPageFooterCallback" />
    </batch:listeners>
</batch:step>

<bean id="dojMatchItemProcessor200"
    class="com.batchinterface.dept.recordresultsvr.DojMatchItemProccesor"
    p:holdingTankDao-ref="holdingTankDao" p:rsdProvider-ref="rsdProvider" p:searchProvider-ref="searchProvider"  />

<bean id="dojDbReader200"
    class="org.springframework.batch.item.database.StoredProcedureItemReader"
    p:dataSource-ref="oracleDataSource" p:rowMapper-ref="dojMatchRowMapper200"
    scope="step" p:function="false" p:procedureName="PKG_JOIN.PRC_SELECT"
    p:preparedStatementSetter-ref="dojmatchpropertySetter200"
    p:refCursorPosition="1">
    <property name="parameters">
        <list>
            <bean class="org.springframework.jdbc.core.SqlOutParameter">
                <constructor-arg index="0" value="c1" />
                <constructor-arg index="1">
                    <util:constant static-field="oracle.jdbc.OracleTypes.CURSOR" />
                </constructor-arg>
            </bean>
            <bean class="org.springframework.jdbc.core.SqlParameter">
                <constructor-arg index="0" value="dept" />
                <constructor-arg index="1">
                    <util:constant static-field="oracle.jdbc.OracleTypes.VARCHAR" />
                </constructor-arg>
            </bean>
        </list>
    </property>
</bean>

<bean id="dojmatchpropertySetter200"
    class="com.batchinterface.dept.recordresultsvr.DojPreparedStateSetter">
    <property name="dept" value="200" />
</bean>

<bean id="dojMatchRowMapper200"
    class="com.batchinterface.dept.recordresultsvr.DojMatchRowMapper" />

<bean id="dojClassifierMatchReportWriter200"
    class="org.springframework.batch.item.support.ClassifierCompositeItemWriter"
    p:classifier-ref="dojMatchClassifier200">
</bean>

<bean id="dojMatchClassifier200"
    class="com.batchinterface.dept.recordresultsvr.DojMatchReportClassifier"
    p:itemWriterMatch200-ref="itemWriterMatch200"
    p:itemWriterUnMatch200-ref="itemWriterUnMatch200"
    p:lastRunDate-ref="LastSuccessfulRunDate200">
</bean>
<!-- End dojMainStep200 -->
<!-- Start dojMainStep400 -->
<batch:step id="dojMainStep400" abstract="true">
    <batch:tasklet>
        <batch:chunk commit-interval="1000" reader="dojDbReader400"
            processor="dojMatchItemProcessor400" writer="dojClassifierMatchReportWriter400">
            <batch:streams>
                <batch:stream ref="itemWriterMatch400" />
                <batch:stream ref="itemWriterUnMatch400" />
            </batch:streams>
        </batch:chunk>
    </batch:tasklet>
    <batch:listeners>
        <batch:listener ref="dojMatch400PageHeaderCallback" />
        <batch:listener ref="dojUnMatch400PageHeaderCallback" />
        <batch:listener ref="dojInPageFooterCallback" />
    </batch:listeners>
</batch:step>

<bean id="dojMatchItemProcessor400"
    class="com.batchinterface.dept.recordresultsvr.DojMatchItemProccesor"
    p:holdingTankDao-ref="holdingTankDao" p:rsdProvider-ref="rsdProvider" p:searchProvider-ref="searchProvider"  />

<bean id="dojDbReader400"
    class="org.springframework.batch.item.database.StoredProcedureItemReader"
    p:dataSource-ref="oracleDataSource" p:rowMapper-ref="dojMatchRowMapper400"
    scope="step" p:function="false" p:procedureName="PKG_JOIN.PRC_SELECT"
    p:preparedStatementSetter-ref="dojmatchpropertySetter400"
    p:refCursorPosition="1">
    <property name="parameters">
        <list>
            <bean class="org.springframework.jdbc.core.SqlOutParameter">
                <constructor-arg index="0" value="c1" />
                <constructor-arg index="1">
                    <util:constant static-field="oracle.jdbc.OracleTypes.CURSOR" />
                </constructor-arg>
            </bean>
            <bean class="org.springframework.jdbc.core.SqlParameter">
                <constructor-arg index="0" value="dept" />
                <constructor-arg index="1">
                    <util:constant static-field="oracle.jdbc.OracleTypes.VARCHAR" />
                </constructor-arg>
            </bean>
        </list>
    </property>
</bean>

<bean id="dojmatchpropertySetter400"
    class="com.batchinterface.dept.recordresultsvr.DojPreparedStateSetter">
    <property name="dept" value="400" />
</bean>

<bean id="dojMatchRowMapper400"
    class="com.batchinterface.dept.recordresultsvr.DojMatchRowMapper" />

<bean id="dojClassifierMatchReportWriter400"
    class="org.springframework.batch.item.support.ClassifierCompositeItemWriter"
    p:classifier-ref="dojMatchClassifier400">
</bean>

<bean id="dojMatchClassifier400"
    class="com.batchinterface.dept.recordresultsvr.DojMatchReportClassifier"
    p:itemWriterMatch400-ref="itemWriterMatch400"
    p:itemWriterUnMatch400-ref="itemWriterUnMatch400"
    p:lastRunDate-ref="LastSuccessfulRunDate400">
</bean>
<!-- End dojMainStep400 -->
<!-- End parallelProcessMatch -->


此功能在单线程模式下工作吗?我的直觉是,这和Spring批处理无关,和您的代码有关……我并没有同步dao类方法,在创建同步的dao类方法之后,它工作正常。/**使ItemProcessor的dao类方法和进程方法同步。**/私有更新道@重写公共同步MatchOutObject进程(MatchInObject obj)引发异常{dao.update(obj);