簡體   English   中英

Spring Batch FlatFileItemReader 在以后的步驟中提供文件名

[英]Spring Batch FlatFileItemReader provide filename in future step

所以我正在構建一個使用 Spring Batch 的批處理。 我定義了一個有幾個步驟的作業,第一個是 Tasklet 的實現,它是一個文件觀察器,並檢查與特定文件掩碼匹配的任何文件的目錄。 找到該文件后,我們將繼續進行該過程的下一步。 最初,這也是 Tasklet 的另一種實現,我們循環遍歷文件和每條記錄,批量加載到 Oracle。 這花費的時間太長了。 我發現使用 FlatFileItemReader 和 JdbcBatchItemWriter 確實快了 1000 倍。 無論如何,我的問題是,當使用 FlatFileItemReader 時,我必須定義我的資源並在創建該 Bean 時提供 FileSystemResouce。 我真的想在我的第一步完成后提供該文件名,因為我需要運行一個文件觀察器並找出我們想要處理的文件名。 有沒有辦法實現這一目標?

@Bean
public FlatFileItemReader<PartnerRelationship> partnerRelationshipReader() throws ParseException {
    FlatFileItemReader<PartnerRelationship> reader = new FlatFileItemReader<>();
    reader.setResource(new FileSystemResource("/path/to/my/file/file_20210714.dat"));
    reader.setBufferedReaderFactory(new CustomFileReaderFactory());
    reader.setStrict(false);
    reader.setLineMapper(new DefaultLineMapper<PartnerRelationship>() {{
        setLineTokenizer(new FixedLengthTokenizer() {{
            setNames(Constants.partnerRelationshipFields);
            setColumns(Constants.partnerRelationshipIndeces);
        }});
        setFieldSetMapper(new PartnerRelationshipFieldSetMapper());
    }});
    return reader;
}

您可以將資源傳遞給 jobExecutionContext:

ExecutionContext jobExecutionContext = stepExecution.getJobExecution().getExecutionContext();
jobExecutionContext.put("resource", res);

如果您設置了 bean stepScope,則可以檢索它:

@Bean
@StepScope
public FlatFileItemReader<PartnerRelationship> partnerRelationshipReader(@Value #{jobExecutionContext['resource']} Resource res) throws ParseException {
    FlatFileItemReader<PartnerRelationship> reader = new FlatFileItemReader<>();
    reader.setResource(res);
    reader.setBufferedReaderFactory(new CustomFileReaderFactory());
    reader.setStrict(false);
    reader.setLineMapper(new DefaultLineMapper<PartnerRelationship>() {{
        setLineTokenizer(new FixedLengthTokenizer() {{
            setNames(Constants.partnerRelationshipFields);
            setColumns(Constants.partnerRelationshipIndeces);
        }});
        setFieldSetMapper(new PartnerRelationshipFieldSetMapper());
    }});
    return reader;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM