19

ファイルを解析するために春のバッチを使用していますが、次のシナリオがあります。

私は仕事をしています。このジョブは、与えられたファイルを解析する必要があります。予期しない理由 (停電など) でサーバーに障害が発生し、マシンを再起動する必要があります。ここで、サーバーを再起動した後、停電前に停止した時点からジョブを再開したいと考えています。これは、システムが 10.000 から 1.300 行を読み取った場合、1.301 行から読み取りを開始する必要があることを意味します。

春のバッチを使用してこのシナリオを実現するにはどうすればよいですか?

構成について: ディレクトリの下で新しいファイルをポーリングする spring-integration を使用します。ファイルが到着すると、スプリング統合によってスプリング バッチ ジョブが作成されます。また、spring-batch は FlatFileItemReader を使用してファイルを解析します。

4

4 に答える 4

4

JVM クラッシュ後にジョブを再起動するための完全なソリューションを次に示します。

  1. restarable="true" にすることで、ジョブを再開可能にします

ジョブ id="ジョブ名" xmlns="http://www.springframework.org/schema/batch" restartable="true"

2. ジョブを再開するコード

import java.util.Date;
import java.util.List;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.batch.core.BatchStatus;
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobInstance;
import org.springframework.batch.core.explore.JobExplorer;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.batch.core.launch.JobOperator;
import org.springframework.batch.core.repository.JobRepository;
import org.springframework.beans.factory.annotation.Autowired;

public class ResartJob {

    @Autowired
    private JobExplorer jobExplorer;
    @Autowired
    JobRepository jobRepository;
    @Autowired
    private JobLauncher jobLauncher;
    @Autowired 
    JobOperator jobOperator;

    public void restart(){
        try {
            List<JobInstance> jobInstances = jobExplorer.getJobInstances("jobName",0,1);// this will get one latest job from the database
            if(CollectionUtils.isNotEmpty(jobInstances)){
               JobInstance jobInstance =  jobInstances.get(0);
               List<JobExecution> jobExecutions = jobExplorer.getJobExecutions(jobInstance);
               if(CollectionUtils.isNotEmpty(jobExecutions)){
                   for(JobExecution execution: jobExecutions){
                       // If the job status is STARTED then update the status to FAILED and restart the job using JobOperator.java
                       if(execution.getStatus().equals(BatchStatus.STARTED)){ 
                           execution.setEndTime(new Date());
                           execution.setStatus(BatchStatus.FAILED);                               
                           execution.setExitStatus(ExitStatus.FAILED);                               
                           jobRepository.update(execution);
                           jobOperator.restart(execution.getId());
                       }
                   }
               }
            }
        } catch (Exception e1) {
            e1.printStackTrace();
        }
    }
}

3.

<bean id="jobRepository" class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean" p:dataSource-ref="dataSource" p:transactionManager-ref="transactionManager" p:lobHandler-ref="oracleLobHandler"/>

<bean id="oracleLobHandler" class="org.springframework.jdbc.support.lob.DefaultLobHandler"/>


<bean id="jobExplorer" class="org.springframework.batch.core.explore.support.JobExplorerFactoryBean" p:dataSource-ref="dataSource" />

<bean id="jobRegistry" class="org.springframework.batch.core.configuration.support.MapJobRegistry" />

<bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
        <property name="jobRepository" ref="jobRepository" />
        <property name="taskExecutor" ref="jobLauncherTaskExecutor" /> 
</bean> <task:executor id="jobLauncherTaskExecutor" pool-size="6" rejection-policy="ABORT" />

<bean id="jobOperator" class="org.springframework.batch.core.launch.support.SimpleJobOperator" p:jobLauncher-ref="jobLauncher" p:jobExplorer-re`enter code here`f="jobExplorer" p:jobRepository-ref="jobRepository" p:jobRegistry-ref="jobRegistry"/>
于 2016-03-25T17:50:10.510 に答える
0

あなたの状況で私がすることは、最後に処理された行をファイルに記録するステップを作成することです。次に、このファイルを読み取り、特定の行番号から処理を開始する2番目のジョブを作成します。

したがって、何らかの理由でジョブが停止した場合は、処理を再開する新しいジョブを実行できます。

于 2013-03-05T19:30:40.770 に答える