首页 > 解决方案 > 如果文件输入资源不存在则跳过步骤

问题描述

我在一个作业中有 12 个步骤,其中的步骤是从 csv 和 txt 文件中读取的。如果目录中不存在与该步骤对应的文件,我正在尝试添加跳过该步骤的功能,使用 JobExecutionDecider 遵循此https://docs.spring.io/spring-batch/docs/current/reference/ html/step.html#programmaticFlowDecisions。当目录中不存在文件时,它工作正常。相反,如果文件存在,它会在第一个 from 处停止。

jobBuilderFactory.get("importFileJob")
            .listener( new ImportFileJobListener() )
            .incrementer( new RunIdIncrementer() )
            .start( truncateAnagraficheTableStep( QUERY_TRUNCATE_INTERFACE_IN_ANAGRAFICHE ) )
            .next( new Decider( directory, file01Prefix ) ).on( "FAILED" ).to( truncateContrattiTableStep( QUERY_TRUNCATE_INTERFACE_IN_CONTRATTI ) )
            .from( new Decider( directory, file01Prefix ) ).on( "COMPLETED" ).to( anagraficheStep( QUERY_INSERT_INTERFACE_IN_ANAGRAFICHE ) )
            .next( anagraficheStep( QUERY_INSERT_INTERFACE_IN_ANAGRAFICHE ) )
            .next( truncateContrattiTableStep( QUERY_TRUNCATE_INTERFACE_IN_CONTRATTI ) )
            .next( new Decider( directory, file02Prefix ) ).on( "FAILED" ).to( truncateCapitalLimitTableStep( QUERY_TRUNCATE_INTERFACE_IN_CAPITAL_LIMIT ) )
            .from( new Decider( directory, file02Prefix ) ).on( "COMPLETED" ).to( contrattiStep( QUERY_INSERT_INTERFACE_IN_CONTRATTI ) )
            .next( contrattiStep( QUERY_INSERT_INTERFACE_IN_CONTRATTI ) )
            .next( truncateCapitalLimitTableStep( QUERY_TRUNCATE_INTERFACE_IN_CAPITAL_LIMIT ))
            .next( new Decider( directory, file03Prefix ) ).on( "FAILED" ).to( truncateEsitiPefTableStep( QUERY_TRUNCATE_INTERFACE_IN_ESITI_PEF ) )
            .from( new Decider( directory, file03Prefix ) ).on( "COMPLETED" ).to( capitalLimitStep( QUERY_INSERT_INTERFACE_IN_CAPITAL_LIMIT ) )
            .next( capitalLimitStep( QUERY_INSERT_INTERFACE_IN_CAPITAL_LIMIT ))
            .next( moveTextFilesStep() )
            .next( truncateEsitiPefTableStep( QUERY_TRUNCATE_INTERFACE_IN_ESITI_PEF ) )
            .next( new Decider( directory, file04Prefix ) ).on( "FAILED" ).to( truncateStatoOperazioniTableStep( QUERY_TRUNCATE_INTERFACE_IN_STATO_OPERAZIONI ) )
            .from( new Decider( directory, file04Prefix ) ).on( "COMPLETED" ).to( esitiPefStep() )
            .next(esitiPefStep())
            .next( truncateStatoOperazioniTableStep( QUERY_TRUNCATE_INTERFACE_IN_STATO_OPERAZIONI ) )
            .next( new Decider( directory, file05Prefix ) ).on( "FAILED" ).fail()
            .from( new Decider( directory, file05Prefix ) ).on( "COMPLETED" ).to( statoOperazioniStep() )
            .next( statoOperazioniStep() )
            .next( moveExcelFilesStep() )
            .end()
            .build();

这是决策者的代码

public class Decider implements JobExecutionDecider {

private static Logger logger = Logger.getLogger("techLog");
private File directory;
private String filePrefix;


public Decider(File directory, String filePrefix) {
    super();
    this.directory = directory;
    this.filePrefix = filePrefix;
}


@Override
public FlowExecutionStatus decide(JobExecution jobExecution, StepExecution stepExecution) {
    // TODO Auto-generated method stub
    String status;
    
    File[] inputFiles = directory.listFiles((dir, name) -> name.startsWith(filePrefix) );
    if ( inputFiles.length == 0 ) {
        logger.error( "Input resource does not exist file " + directory + "\\" + filePrefix );
        status = "FAILED";
    }
    else {
        status = "COMPLETED";
    }
    return new FlowExecutionStatus(status);
}

}

标签: spring-batch

解决方案


这是您的决策者实施的问题。FlowExecutionStatus您可以根据文件的存在/不存在来指定要返回的值。


推荐阅读