当前位置: 首页 > 知识库问答 >
问题:

Spring Batch FlatFileItemReader在未来步骤中提供文件名

殷永嘉
2023-03-14

所以我正在构建一个使用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;
}

共有1个答案

陆伟
2023-03-14

您可以将资源传递到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;
}
 类似资料:
  • 使用一个不同的测试运行器(基于注释的测试运行器),这些步骤将被拾取并运行。不过,基于注释的方法似乎不支持步骤工厂,所以我交换了模型。现在,它将加载steps类(在调用构造函数时会发生一些可见的事情),但它不会识别其中的任何步骤。有什么想法吗?下面是我的嵌入器类: }

  • 我必须在一次登录中运行多个案例的功能文件。对于ex: 场景:当用户使用“用户名”和“密码”登录并且用户检查“on”和用户检查“on”时,检查总计 示例: |用户名|密码|金额1|日期1|金额2|日期2|... 我需要在一次登录中检查日期金额,而在我的场景中,每次登录数据表中的每个条目。我如何实现它? 相反,我希望这样: 当用户使用“用户名”和“密码”登录时 示例: |用户名|密码|...只使用一次

  • 可以使用angular cli生成服务,并将其作为提供者添加到app.module中。一步到位还是在nggservice命令中使用特殊选项? 当执行: 在它旁边(根据警告消息),我通常会将它添加到app.module的provider部分。ts使用文本编辑器: 有没有可能用一个简单的步骤来实现自动化?

  • 我试图找出是否有一个选项来找出当前正在执行的cucumber步骤,我试图根据步骤名称执行某些操作。 我可以看到StepDefinitionMatch类获得了这些步骤,但我不确定如何在运行时访问这些步骤。有人帮忙吗?如果有帮助,添加调用堆栈的快照。

  • 我是新春尝试简单的webapp。 使用springboot 2.1.0application.properties如下文件。我在src/main/webapp/WEB-INF/jsp中有jsp文件 我的控制器是。 当我将jsp文件放在/main/resources/META-INF/resources/WEB-INF/jsp中时,它可以正常工作,否则会出现以下错误 pom还具有tomcat嵌入ja

  • 我试图用django管道编译静态,但无法在开发模式下为静态服务。由于我不是Django开发人员,我可能对Django为静态文件本身提供服务的方式有所误解。这是我的项目结构: 项目(项目本身) css 应用程序。斯蒂尔 媒体 当我使用共享静态时,我已经指定了指令来允许Django dev server和命令查找共享静态: 这是我的: 在我的模板中,我指定了CSS组: 因此,生成这样的HTML: 但返