我有一个在构造函数中编写的方法。
当我安排 Spring 批处理作业时,该方法不会在特定时间间隔内被调用。
只有在 Spring Batch Application 启动时才会调用它。
任何人都可以建议任何逻辑我如何安排一个Spring Batch
应用程序,该应用程序将在特定时间间隔内重新启动我的应用程序。
private int nextULPIndex;
private List<Data> finalULPData;
public JsonItemReaderFromULProspector() {
ULProspectorAPICall.runShellScript();
logger.info("API call to ULProspector successfully executed inside JsonItemReaderFromULProspector");
logger.info("Inside Constructor of JsonItemReaderFromULProspector");
initialize();
}
private void initialize() {
List<Data> ulpData = ReadJSONFromULP.getJsonObject();
logger.info("initialize() Started");
finalULPData = Collections.unmodifiableList(ulpData);
nextULPIndex = 0;
}
在 ItemReader 类的 run() 方法中调用 finalULPData
我无法在 run() 中调用 initialize(),因为 run() 方法会根据块大小重复调用。
public class JsonItemReaderFromULProspector implements ItemReader<Data> {
@Override
public Data read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {
Data nextULPData = null;
logger.info("read() method JsonItemReaderFromULProspector class :Start");
if (nextULPIndex < finalULPData.size()) {
nextULPData = finalULPData.get(nextULPIndex);
nextULPIndex++;
}
return nextULPData;
}
}
此类从 BatchConfig 类中调用,如下所示。
@StepScope
@Lazy
ItemReader<Data> reader() {
return new JsonItemReaderFromULProspector();
}
@Bean
@Lazy
public Step step1() throws Exception {
return stepBuilderFactory.get("step1").<Data, ULPData>chunk(10).reader(reader()).processor(ulProspectorDataProcessor()).writer(ulpDataWriter.jsonFileDatabaseItemWriter()).build();
}
@Bean
public Job job() throws Exception {
return this.jobBuilderFactory.get("job").incrementer(new RunIdIncrementer())
.start(callUlPApiStep())
.next(deleteRecordsFromTableStep())
.next(step1()).build();}