能够运行基本作业(读->处理->写)。现在,我想从配置文件(稍后)或命令行(现在可以使用它)中读取参数(如日期、文件名、类型等),并在我的工作中使用它们。
入口点:
// 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);
}
现在,我要找的是:
简而言之,我在寻找一种方法,
有人能提供我应该在我的BatchConfig.java和其他地方做哪些附加操作来读取作业参数(从命令行或配置文件,无论哪一个容易)吗?
可以从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作业。