mercredi 15 avril 2015

Spring Batch. Setting 'allow-start-if-complete = "false"' - does not work

Spring Batch. Setting 'allow-start-if-complete = "false"' - does not work.


Hello Everyone!


I only study Spring Batch, and now faced with the following problem: I have a 3 step:



<job id="job_test" restartable="true">
<step id="firstStep" next="secondStep">
<tasklet transaction-manager="db2dManager" allow-start-if-complete="false">
<chunk reader="getTheSameID" writer="deleteTheSameData" commit-interval="10"/>
</tasklet>
</step>
<step id="secondStep" next="thirdStep">
<tasklet transaction-manager="db2dManager" allow-start-if-complete="false">
<chunk reader="getTheData" writer="insertTheData" commit-interval="10"/>
</tasklet>
</step>
<step id="thirdStep">
<tasklet transaction-manager="db2dManager">
<chunk reader="selectRead" writer="updateWrite" commit-interval="10"/>
</tasklet>
</step>
</job>


Description of the steps below:



<!--reader-->
<beans:bean id="getTheSameID" class="org.springframework.batch.item.database.JdbcCursorItemReader" scope="step">
<beans:property name="dataSource" ref="dataSourceDB2D"/>
<beans:property name="sql">
<beans:value>
<![CDATA[
Select a.id, a.first_name, a.last_name, a.birthday, a.phone
From lfts.my_test a join lfts.my_test_two b on a.id = b.id
Where a.birthday < #{jobParameters['birthday']} with ur
]]>
</beans:value>
</beans:property>
<beans:property name="rowMapper">
<beans:bean class="ru.rzd.gvc.sbd.jobs.job_my_test.MyTestRowMapper"/>
</beans:property>
</beans:bean>
<!--writer -->
<beans:bean id="deleteTheSameData" class="org.springframework.batch.item.database.JdbcBatchItemWriter">
<beans:property name="dataSource" ref="dataSourceDB2D"/>
<beans:property name="sql" value="delete from lfts.my_test Where id = :id"/>
<beans:property name="itemSqlParameterSourceProvider">
<beans:bean class="org.springframework.batch.item.database.BeanPropertyItemSqlParameterSourceProvider"/>
</beans:property>
</beans:bean>

<!-- reader -->
<beans:bean id="getTheData" class="org.springframework.batch.item.database.JdbcCursorItemReader">
<beans:property name="dataSource" ref="dataSourceDB2D"/>
<beans:property name="sql">
<beans:value>
<![CDATA[
Select * From lfts.my_test with ur
]]>
</beans:value>
</beans:property>
<beans:property name="rowMapper">
<beans:bean class="ru.rzd.gvc.sbd.jobs.job_my_test.MyTestRowMapper"/>
</beans:property>
</beans:bean>
<!--writer -->
<beans:bean id="insertTheData" class="org.springframework.batch.item.database.JdbcBatchItemWriter">
<beans:property name="dataSource" ref="dataSourceDB2D"/>
<beans:property name="sql"
value="insert into lfts.my_test_two (id, first_name, last_name, birthday, phone) values (:id, :firstName, :lastName, :birthday, :phone)"/>
<beans:property name="itemSqlParameterSourceProvider">
<beans:bean class="org.springframework.batch.item.database.BeanPropertyItemSqlParameterSourceProvider"/>
</beans:property>
</beans:bean>

<!--reader -->
<beans:bean id="selectRead" class="org.springframework.batch.item.database.JdbcCursorItemReader">
<beans:property name="dataSource" ref="dataSourceDB2D"/>
<beans:property name="sql">
<beans:value>
<![CDATA[
Select id, first_name, last_name, birthday, phone From lfts.my_test_two Where id = 19 with ur
]]>
</beans:value>
</beans:property>
<beans:property name="rowMapper">
<beans:bean class="ru.rzd.gvc.sbd.jobs.job_my_test.MyTestRowMapper"/>
</beans:property>
</beans:bean>
<!--processor-->
<!--<beans:bean id="testProcessor" class="ru.rzd.gvc.sbd.jobs.job_my_test.MyTestProcessor"/>-->
<!--writer -->
<beans:bean id="updateWrite" class="org.springframework.batch.item.database.JdbcBatchItemWriter">
<beans:property name="dataSource" ref="dataSourceDB2D"/>
<beans:property name="sql"
value="update lfts.my_test set first_name = :first_name, last_name = :lastName "/>
<beans:property name="itemSqlParameterSourceProvider">
<beans:bean class="org.springframework.batch.item.database.BeanPropertyItemSqlParameterSourceProvider"/>
</beans:property>
</beans:bean>


I created artificially error in step 3 (in updateWrite), because of what I have job exits with status (FAILED). Running the job occurs every 10 seconds and the next time you start again launches the first 2 steps (though they are made when you first start job status - COMPLETED). And I want, when job is restarted again that it performs only those steps that culminated in the previous time status - FAILED, and steps to the status COMPLETED does not start. But for now, what I would not do it, I did not get to realize it. Perhaps someone faced a similar problem or know how to implement what I want, please tell me. I would be very grateful.


Sincerely, Michael.


P.s. I'm sorry for my english ...


Aucun commentaire:

Enregistrer un commentaire