spring-batch - 如果文件输入资源不存在则跳过步骤
问题描述
我在一个作业中有 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);
}
}
解决方案
这是您的决策者实施的问题。FlowExecutionStatus
您可以根据文件的存在/不存在来指定要返回的值。
推荐阅读
- sql-server - 使用子字符串/字符索引
- reactjs - 如何解析输入中的文本?
- json - 如何对特定列进行分组,并在 Scala Spark 中将整行作为 JSON 字符串获取?
- spring-mongodb - 我可以用spring从mongodb流式传输二进制文件吗?
- php - 循环生成从今天开始的最后十个星期一
- python - 为什么Init函数返回Object类型而其他函数返回NoneType
- python - Django 2.1+ 批量更新记录及其相关记录的计数?
- vue.js - Adonuxt.js 我的 js 库没有从静态文件夹中调用
- php - 注册后使用自定义闪现会话数据的 Laravel 自定义重定向
- javascript - 您可能需要适当的加载器来处理此文件类型:反应组件中的箭头函数