2016-03-29 16 views
0

私はマスターテーブルからデータを読み取り、アーカイブテーブルに90日以上経過したすべてのレコードを移動するスプリングバッチアプリケーションがあります。チャンクが失敗した場合にバネバッチジョブを中止する方法

私は任意の項目のアーカイブが失敗した場合、バッチは停止してはならないという要件がある

<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> 

として 「

<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> 

、ジョブコンテキストファイルがあるように、アプリケーションのコンテキストファイルがありますそれ以上のレコードをアーカイブし、ユーザにメール通知を送信する。

答えて

0
<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> 

そしてJobListenerJobExecutionListenerを実装し、オーバーライドする必要があります:

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

こんにちは、ヘルプを提供していただきありがとうございます。ここでskip limitは10と定義されていますが、バッチがレコードを処理できない場合は、そのレコードをスキップせずに停止し、メールの通知をその場で送信する必要があります。 –

+0

プロセスはレコードを処理できません==>スキップ不可能な例外です。 ''という例外をスキップしたくない場合は、スキップリミットはあなたが望むように設定することができます –

関連する問題