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

使用spring Boot的spring批处理:从配置或命令行读取参数并在作业中使用它们

桑坚
2023-03-14

能够运行基本作业(读->处理->写)。现在,我想从配置文件(稍后)或命令行(现在可以使用它)中读取参数(如日期、文件名、类型等),并在我的工作中使用它们。

入口点:

// Imports
@SpringBootApplication
@EnableBatchProcessing
public class EtlSpringBatchApplication {

    public static void main(String[] args) {
        SpringApplication.run(EtlSpringBatchApplication.class, args);
    }

}

我的批处理配置

// BatchConfig.java
// Imports
    @Autowired
    public JobBuilderFactory jobBuilderFactory;

    @Autowired
    public StepBuilderFactory stepBuilderFactory;

    @Autowired
    public MyDao myDao;

    @Bean
    public Job job() {
        return jobBuilderFactory
                .get("job")
                .incrementer(new RunIdIncrementer())
                .listener(new Listener(myDao))
                .flow(step1())
                .end()
                .build();
    }

    @Bean
    public Step step1() {
        return stepBuilderFactory.get("step1").<myModel, myModel>chunk(1000)
                .reader(Reader.reader("my_file_20200520.txt"))
                .processor(new Processor())
                .writer(new Writer(myDao))
                .build();
    }
public static FlatFileItemReader<MyModel> reader(String path) {......}

java定义了process方法。我添加了@Beforestep以从DB获取处理所需的一些细节。

public class Processor implements ItemProcessor<MyModel, MyModel> {

    private static final Logger log = LoggerFactory.getLogger(Processor.class);
    private Long id = null;

    @BeforeStep
    public void getId(StepExecution stepExecution) {
        this.id = stepExecution.getJobExecution().getExecutionContext().getLong("Id");
    }

    @Override
    public MyModel process(MyModel myModel) throws Exception {
    }
}

java正在实现ItemWriter和write代码。

java扩展了JobExecutionListenerSupport,并具有重写的afterJob和BeforeJob方法。基本上尝试在BeforeJob中使用executioncontext。

@Override
public void beforeJob(JobExecution jobExecution) {
    log.info("Getting the id..");
    this.id = myDao.getLatestId();
    log.info("id retrieved is: " + this.id);
    jobExecution.getExecutionContext().putLong("Id", this.id);
}

现在,我要找的是:

  • 读取器应从作业参数获取文件名。即在运行作业时,我应该能够给出一些参数,其中之一是文件路径。
  • 后来一些方法(如get id等)需要更少的变量,这些变量可以作为参数传递给作业,如run_date、type等。

简而言之,我在寻找一种方法,

  • 将作业参数传递到我的应用程序(run_date、type、文件路径等)
  • 在读者和其他地方使用它们(听众、撰稿人)

有人能提供我应该在我的BatchConfig.java和其他地方做哪些附加操作来读取作业参数(从命令行或配置文件,无论哪一个容易)吗?

共有1个答案

白才捷
2023-03-14

可以从reader中的配置文件或spring批处理执行上下文中的其他类读取作业参数集的值。下面是一个可供参考的片段,

application.yml文件可以具有以下配置,

batch.configs.filePath: c:\test

启动作业时,可以将从配置中读取的文件路径添加到作业参数中。类的代码段,

// Job and Job Launcher related autowires..

@Value("${batch.configs.filePath}")
private String filePath;

// inside a method block,
JobParameters jobParameters = new JobParametersBuilder().addLong("JobID", System.currentTimeMillis())
            .addString("filePath", filePath).toJobParameters();

try {
    jobLauncher.run(batchJob, jobParameters);
} catch (Exception e) {
    logger.error("Exception while running a batch job {}", e.getMessage());
}

访问作业参数的方法之一是将StepExecutionListener实现到您的reader类,以利用其重写的方法beforeStep和AfterStep。也可以对其他类执行类似的实现,

public class Reader implements ItemReader<String>, StepExecutionListener {

private String filePath;

@Override
public void beforeStep(StepExecution stepExecution) {

    try {
        filePath = (String) stepExecution.getJobExecution().getExecutionContext()
                .get("filePath");
    } catch (Exception e) {
        logger.error("Exception while performing read {}", e);
    }
}


@Override
public String read() throws Exception {
    // filePath value read from the job execution can be used inside read use case impl

}

@Override
public ExitStatus afterStep(StepExecution stepExecution) {
    return ExitStatus.COMPLETED;
}

}

 类似资料:
  • 我的批处理配置: 我的任务: 公共类RemoteFileInboundTasklet实现Tasklet{ 我尝试在配置中将我的tasklet声明为bean并重新构建包。然而,它却给出了同样的错误。 更改后的我的application.properties文件: 任务没有改变。 因此,相应地,我的Tasklet更改为: 基于以上更改,我能够编译代码并创建必要的Jar,并使用Jar运行代码。

  • 我当前正在命令行中传递文件名在spring批处理作业中的参数并运行我的作业,spring批处理作业将查找文件并读取、处理和写入该文件。我目前在读取器中的作业参数文件名和读取器文件名,如何才能在处理器和写入器中使用相同的作业参数文件名。

  • 我不知道如何使用调用Spring批处理中定义的作业,文档细节对我来说是不够的。 我遵循了Spring Batch官方指南,使用Java注释(例如)在Spring Batch中编写作业,因为我希望避免使用XML配置文件来描述作业、步骤等。 到目前为止我已经: 配置类(见下文),我使用AnnotaIon将定义、、、和(带有的所有内容放入其中。 具有方法的类,该方法具有并具有注释,以导入处理作业中的数据

  • 我在基于Java的配置文件中定义了批处理作业。我已经看到,可以用来启动作业,但是作业定义应该在中定义。xml。我想使用来运行在基于java的配置中定义的作业。 根据这里的文件:https://docs.spring.io/spring-batch/trunk/reference/html/configureJob.html#commandLineJobRunner,没有具体细节。 我们能做到吗?其

  • 在Windows中,如何访问批处理文件运行时传递的参数? 例如,假设我有一个名为< code>hello.bat的程序。当我在Windows命令行输入< code>hello -a时,如何让我的程序知道< code>-a是作为参数传入的?

  • 我能够通过命令行使用成功地启动springboot-batch作业。