简体   繁体   English

如果任何块失败,如何中止春季批处理作业

[英]how to abort a spring batch job if any chunk fails

I have a spring batch application which reads the data from master table and moves all the records which are older that 90 days to an archive table. 我有一个春季批处理应用程序,该应用程序从主表中读取数据,并将所有90天以上的记录移至存档表中。

the application context file is as " 应用程序上下文文件为“

<context:property-placeholder location="classpath:batch.properties" />

<context:component-scan base-package="com.prax.batch" />

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" >
    <property name="url" value="${batch.jdbc.url}"/>
    <property name="driverClassName" value="${batch.jdbc.driver}"/>
    <property name="username" value="${batch.jdbc.user}"/>
    <property name="password" value="${batch.jdbc.password}"/>
</bean>

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>

<bean id="jobReposotoryTransactionManager" class="org.springframework.batch.support.transaction.ResourcelessTransactionManager"/>

<bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
    <property name="jobRepository" ref="jobRepository"></property>
</bean>

<!-- <jdbc:initialize-database data-source="dataSource">
    <jdbc:script location="${batch.schema.script}" />
</jdbc:initialize-database> -->

<!-- <batch:job-repository id="jobRepository" transaction-manager="jobReposotoryTransactionManager"></batch:job-repository> -->

<bean id="jobRepository" class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean" >
    <property name="transactionManager" ref="jobReposotoryTransactionManager"/>
</bean>

<import resource="classpath:/META-INF/spring/module-context.xml" />



</beans>

and job context file is as 和工作上下文文件是

<batch:job id="fqtvArchiveJob">
    <batch:step id="readWriteDeleteStep">
        <batch:tasklet transaction-manager="transactionManager"
            start-limit="10">
            <batch:chunk reader="fqtvreader" writer="fqtvcompositewriter"
                commit-interval="1000" />
        </batch:tasklet>
    </batch:step>
</batch:job>


<bean id="fqtvreader"
    class="org.springframework.batch.item.database.JdbcCursorItemReader">
    <property name="rowMapper" ref="fqtvrowmapper" />
    <property name="dataSource" ref="dataSource" />
    <property name="sql" value="${batch.reader.sql}" />
    <property name="maxRows" value="0"/>
    <property name="fetchSize" value="0" />
</bean>

<bean id="fqtvinsertwriter"
    class="org.springframework.batch.item.database.JdbcBatchItemWriter">
    <property name="assertUpdates" value="true" />
    <property name="dataSource" ref="dataSource" />
    <property name="itemPreparedStatementSetter" ref="fqtvpreparedstatementsetter" />
    <property name="sql" value="${batch.writer.insert.sql}" />
</bean>

<bean id="fqtvdeletewriter"
    class="org.springframework.batch.item.database.JdbcBatchItemWriter">
    <property name="assertUpdates" value="true" />
    <property name="dataSource" ref="dataSource" />
    <property name="itemPreparedStatementSetter" ref="deletestatementsetter" />
    <property name="sql" value="${batch.writer.delete.sql}" />
</bean>

<bean id="fqtvcompositewriter"
    class="org.springframework.batch.item.support.CompositeItemWriter">
    <property name="delegates">
        <list>
            <ref local="fqtvinsertwriter"/>
            <ref local="fqtvdeletewriter"/>
        </list>
    </property>
</bean>

<bean id="fqtvrowmapper" class="com.prax.job.util.FqtvRowMapper"          />

<bean id="fqtvpreparedstatementsetter"
    class="com.prax.job.util.FqtvPreparedStatementSetter" />

<bean id="deletestatementsetter"
    class="com.prax.job.util.FqtvDeleteStatementSetter" />

</beans>

I have the requirement that if archiving of any item fails, the batch should stop and not archive any more record and send the mail notification to the users. 我的要求是,如果任何项目的归档失败,则该批处理应停止并且不再归档任何记录,并将邮件通知发送给用户。

 <batch:job id="fqtvArchiveJob">
  <batch:step id="readWriteDeleteStep">
     <batch:tasklet transaction-manager="transactionManager"
        start-limit="10">
        <batch:chunk reader="fqtvreader" writer="fqtvcompositewriter"
            commit-interval="1000" skip-limit="10" >
        <skippable-exception-classes>
            <exclude class="customExceptionIDontWannaSkip"/>
        </skippable-exception-classes>
       </batch:chunk>
   </batch:tasklet>
 </batch:step>
  <batch:listeners>
                <batch:listener ref="jobListener" />
  </batch:listeners>
</batch:job>

And JobListener should implements JobExecutionListener and override : JobListener应该实现JobExecutionListener和覆盖:

@Override
public void afterJob(JobExecution exec) {
  BatchStatus status = exec.getStatus();
  if (!status.equals(BatchStatus.COMPLETED)){
   //send the mail
  }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM