Spring batch Notes

Spring batch Notes

JobRepository

JobRepository是Spring Batch中一个关键的组件,负责管理任务执行信息的持久性。它提供了一个中央位置来存储批处理作业的执行信息,如作业执行的开始时间、结束时间和状态。

JobRepository的主要目的是提供一种将任务执行信息持久化的方法,以便在后面可以用于分析或重新运行。存储在JobRepository中的任务执行信息可用于确定作业的状态、识别在作业执行期间发生的错误以及重新运行失败的作业。

JobRepository可以使用不同的存储机制实现,比如数据库和内存映射等。Spring Batch提供了内置的JobRepository实现,可将任务执行信息存储在数据库中,可以通过设置数据源和使用Spring Batch提供的SQL脚本在数据库中创建必要的表来配置。

使用JobRepository需要在Spring Batch应用程序配置文件中配置它,并定义一个PlatformTransactionManager来管理事务。之后,可以在批处理作业中使用JobRepository来更新作业的状态和检索有关过去作业执行的信息。

总之,JobRepository是Spring Batch中负责管理任务执行信息持久性的组件,它用来存储批处理作业的执行信息,如开始时间、结束时间和状态。这些信息可以用来分析任务执行情况,并帮助我们决定是否需要重新运行任务,可以使用不同的存储机制来实现,如数据库和内存映射等, 为了使用JobRepository,需要在Spring Batch应用程序配置文件中配置数据源,并使用Spring Batch提供的SQL脚本在数据库中创建必要的表, 之后可以在批处理作业中使用JobRepository来更新作业的状态和检索有关过去作业执行的信息。需要注意的是,在使用JobRepository时需要配置PlatformTransactionManager来管理事务, 保证数据的持久性和一致性。

When using java configuration, a JobRepository is provided for you. A JDBC based one is provided out of the box if a DataSource is provided, the Map based one if not. However you can customize the configuration of the JobRepository via an implementation of the BatchConfigurer interface.

When using @EnableBatchProcessing, a JobRegistry is provided out of the box for you. This section addresses configuring your own.

The most basic implementation of the JobLauncher interface is the SimpleJobLauncher. Its only required dependency is a JobRepository

JobLauncher

JobLauncher是Spring Batch中用来启动作业的组件。它提供了一种简单的方式来启动作业,并且可以传递参数给作业,比如JobParameters

JobLauncher的主要目的是提供一种简单的方式来启动作业,并且可以传递参数给作业。它提供了run()方法来启动作业,这个方法接收两个参数,一个是要启动的作业的名称,另一个是用来传递给作业的参数。

使用JobLauncher需要在Spring Batch应用程序配置文件中创建它的一个实例。之后,可以使用JobLauncher来启动作业。

下面是一个在Spring Batch应用程序配置文件中使用JobLauncher的示例:

@Autowired
private JobLauncher jobLauncher;

@Autowired
private Job job;

public void runJob() throws Exception {
    JobParameters jobParameters = new JobParametersBuilder()
        .addString("input.file", "input.txt")
        .toJobParameters();
    jobLauncher.run(job, jobParameters);
}

在这个例子中,在配置类中创建了一个JobLauncher的实例并进行自动装配,然后runJob()方法使用JobLauncher来启动作业, 传递了一个JobParameters参数给作业,这个参数可以在作业中使用。

总之, JobLauncher是Spring Batch中用来启动作业的组件, 提供了一种简单的方式来启动作业,并且可以传递参数给作业,使用方法是在应用程序配置文件中创建实例并使用run()方法来启动作业。

Running a job

At a minimum, launching a batch job requires two things: the Job to be launched and a JobLauncher. Both can be contained within the same context or different contexts. For example, if launching a job from the command line, a new JVM will be instantiated for each Job, and thus every job will have its own JobLauncher. However, if running from within a web container within the scope of an HttpRequest, there will usually be one JobLauncher, configured for asynchronous job launching, that multiple requests will invoke to launch their jobs.

如果是将spring-batch结合到web container,则需要一个异步jobAsynchronous Job

Historically, offline processing such as batch jobs have been launched from the command-line, as described above. However, there are many cases where launching from an HttpRequest is a better option. Many such use cases include reporting, ad-hoc job running, and web application support. Because a batch job by definition is long running, the most important concern is ensuring to launch the job asynchronously:

Step

1. Chunk-oriented Processing

  1. 参考1:Chunk-oriented Processing官方相关文档
  2. 参考2:demo项目

1. 只需要读和写:

2. 读、处理、写:

2. TaskletStep

Chunk-oriented processing is not the only way to process in a Step. What if a Step must consist of a simple stored procedure call? You could implement the call as an ItemReader and return null after the procedure finishes. However, doing so is a bit unnatural, since there would need to be a no-op ItemWriter. Spring Batch provides the TaskletStep for this scenario.

Tasklet is a simple interface that has one method, execute, which is called repeatedly by the TaskletStep until it either returns RepeatStatus.FINISHED or throws an exception to signal a failure. Each call to a Tasklet is wrapped in a transaction. Tasklet implementors might call a stored procedure, a script, or a simple SQL update statement.

To create a TaskletStep, the bean passed to the tasklet method of the builder should implement the Tasklet interface. No call to chunk should be called when building a TaskletStep. The following example shows a simple tasklet:

@Bean
public Step step1() {
    return this.stepBuilderFactory.get("step1")
    			.tasklet(myTasklet())
    			.build();
}

TaskletStep官方相关文档

3. 使用场景

Tasklet 适用于该 Step 操作不需要读操作,或不需要写操作,或两者都不需要。

而Chunk则适用于典型的Read、Process、Write 操作。

官网的介绍中提到,如果你的步骤包含一个简单的存储过程调用(只存,不需要写),那就可以用Tasklet。当然,你也可以用Chunk,但这时,你的ItemWritter就是一个空实现,看着不自然。

而官网的Tasklet例子只对文件进行删除,不需要读、写文件的内容,因此使用Tasklet也就非常合适了。

MapJobRepositoryFactoryBean和JobRepositoryFactoryBean

MapJobRepositoryFactoryBeanJobRepositoryFactoryBean是Spring Batch提供的两个工厂类,用来创建JobRepository实例。两者的主要区别在于它们使用的存储机制不同

MapJobRepositoryFactoryBean用来创建一个使用内存映射存储任务执行信息的JobRepository实例。这意味着任务执行信息不会在应用程序的不同运行之间持久化,只能在当前应用程序实例中使用。这通常用于开发或测试环境,在这些环境中不需要数据持久化。

JobRepositoryFactoryBean用来创建一个使用数据库存储任务执行信息的JobRepository实例。这意味着任务执行信息可以在应用程序的不同运行之间持久化,可以在以后检索分析或重新运行。这通常用于生产环境,需要数据持久化。

总的来说, 如果不需要数据持久化,可以使用MapJobRepositoryFactoryBean,否则使用JobRepositoryFactoryBean更好。

PlatformTransactionManager

PlatformTransactionManager是Spring Batch中一个关键的组件,主要用于提供批处理作业的事务管理。它负责管理批处理作业的事务边界,如在作业开始前启动新事务,在作业完成后提交或回滚事务。

其中主要作用是保证批处理作业处理的数据的一致性和完整性。通过在作业开始前启动一个事务,并在作业完成后提交或回滚事务, PlatformTransactionManager能确保在作业期间对数据进行的所有修改都能被完全提交或完全回滚,即使在发生错误或失败的情况下也是如此。

另一个用途是通过减少数据库提交次数来提高批处理作业的性能。通过在单个事务中包装多个数据库操作, PlatformTransactionManager可以大大减少数据库提交次数,提高批处理作业的性能。 PlatformTransactionManager通常与其他Spring Batch组件,如JobRepositoryItemWriter结合使用,为批处理作业提供完整的事务管理解决方案。

总之, PlatformTransactionManager负责管理批处理作业的事务边界,用来保证批处理作业处理的数据的一致性和完整性,并且通过减少数据库提交次数来提高批处理作业的性能。

JobBuilderFactory

JobBuilderFactory是Spring Batch提供的一个工厂类,用来创建JobBuilder的实例。JobBuilder是一个帮助类,用于配置和构建Job实例。JobBuilderFactory通常用于Spring Batch应用程序的配置中,用来创建和配置Job实例。

JobBuilderFactory的主要目的是提供一种简洁方便的方式来创建和配置Job实例。它提供了一些方法来配置Job的各个方面,如名称、要使用的**JobRepository**和要使用的**JobExecutionListener**

使用JobBuilderFactory需要在Spring Batch应用程序配置文件中创建它的一个实例。之后,可以使用JobBuilderFactory来创建和配置Job实例, 可以通过调用它的方法来实现。

下面是一个在Spring Batch应用程序配置文件中使用JobBuilderFactory的示例:

@Autowired
private JobBuilderFactory jobBuilderFactory;

@Bean
public Job job1() {
    return jobBuilderFactory.get("job1")
        .start(step1())
        .build();
}

在这个例子中,在配置类中创建了一个JobBuilderFactory的实例并进行自动装配,然后job1()方法使用JobBuilderFactory创建和配置了名为"job1"的Job实例,并且这个Job实例只有一个step "step1"

总之, JobBuilderFactory 是 Spring Batch 提供的工厂类,用来创建和配置 Job 实例,提供了一种简洁方便的方式来创建和配置 Job 实例, 通过调用它的方法来实现。

StepBuilderFactory

StepBuilderFactory是Spring Batch提供的一个工厂类, 用来创建StepBuilder的实例。StepBuilder是一个帮助类,用于配置和构建Step实例。StepBuilderFactory通常用于Spring Batch应用程序的配置中,用来创建和配置Step实例。

StepBuilderFactory的主要目的是提供一种简洁方便的方式来创建和配置Step实例。它提供了一些方法来配置Step的各个方面,如名称,要执行的tasklet,以及要使用的ItemReader, ItemProcessor,和ItemWriter

使用StepBuilderFactory需要在Spring Batch应用程序配置文件中创建它的一个实例。之后,可以使用StepBuilderFactory来创建和配置Step实例, 通过调用它的方法来实现。

下面是一个在Spring Batch应用程序配置文件中使用StepBuilderFactory的示例:

@Autowired
private StepBuilderFactory stepBuilderFactory;

@Bean
public Step step1() {
    return stepBuilderFactory.get("step1")
        .<String, String> chunk(10)
        .reader(itemReader())
        .processor(itemProcessor())
        .writer(itemWriter())
        .build();
}

在这个例子中,在配置类中创建了一个StepBuilderFactory的实例并进行自动装配,然后step1()方法使用StepBuilderFactory创建和配置了名为"step1"的Step实例,并且这个Step实例的chunk的大小为10, reader, processor, writeritemReader(), itemProcessor(), itemWriter() 总之,StepBuilderFactory是Spring Batch提供的工厂类,用来创建和配置Step实例,提供了一种简洁方便的方式来创建和配置Step实例,通过调用它的方法来实现。

JobExplorer

JobExplorer是Spring Batch中的一个重要接口,主要作用是查询和检索作业的执行状态和历史信息。它主要用于支持监控和管理作业的运行状态

JobExplorer提供了很多方法,可以查询作业执行的状态,例如:

  • getJobNames():获取所有作业名称。
  • getJobInstance(JobInstance jobInstance):根据JobInstance查询作业实例。
  • getJobExecutions(JobInstance jobInstance):根据JobInstance查询作业执行。
  • getStepExecutions(JobExecution jobExecution):根据JobExecution查询步骤执行。

JobExplorer 一般是和 JobRepository 配合使用, **JobRepository**负责维护作业状态, **JobExplorer** 则用于查询和检索这些状态

在实际项目中,您可以使用JobExplorer查询作业的运行状态,并在需要时对其进行重启或停止。