是否有一种方法可以跳过仅针对特定作业的SpringBatch持久化元数据



有几个例子说明了如何在不将元数据持久化到数据库的情况下使用SpringBatch。以下是一些关于此事的例子和相关问题:

  • Spring Batch没有将元数据持久化到数据库?

  • 如何避免DB 中元数据的Spring批量持久化

  • Spring Batch-如何防止批处理将事务存储在DB 中

  • Spring引导+不带DataSource 的Spring批处理

然而,我有一个稍微不同的用例:我有一些每隔一小时左右运行一次的作业,其中我希望将元数据持久化到我的数据库中(例如,创建报告、运行一些测试,这两项工作的处理量可能都有点重(。我还有一些其他类型的作业,每隔一分钟左右就会运行一次(例如,解锁由于重复错误输入密码而被锁定的用户帐户等(,这些作业不需要太多处理,只需要一个简单的sql查询。

问题分为两部分:

  1. 有没有一种方法可以在数据库中保留第一类作业的元数据(例如,报告处理(,而对第二类作业则完全不使用数据库持久性(例如,解锁用户帐户(?

  2. 或者,即使将Spring Batch用于第二种类型的作业,也会显得过于夸张/根本不需要吗?一个带有@Scheduled注释的方法就足够了吗?

以下是我如何实现我想要的,关于Mahmoud Ben Hassine的建议(删除了@EnableBatchProcessing,针对一些无关的问题-请参阅此处(:

我有两个配置类:

@Configuration
public class SpringBatchConfiguration extends DefaultBatchConfigurer {
@Inject public SpringBatchConfiguration(DataSource dataSource) {
super(dataSource);
}
@Bean(name = "persistentJobLauncher")
public JobLauncher jobLauncher() throws Exception {
return super.createJobLauncher();
}
@Bean
@Primary
public StepBuilderFactory stepBuilderFactory() {
return new StepBuilderFactory(super.getJobRepository(), super.getTransactionManager());
}
@Bean
@Primary
public JobBuilderFactory jobBuilderFactory(){
return new JobBuilderFactory(super.getJobRepository());
}
@Bean
public JobExplorer jobExplorer() {
return super.getJobExplorer();
}
@Bean
public JobRepository jobRepository() {
return super.getJobRepository();
}
@Bean
public ListableJobLocator jobLocator() {
return new MapJobRegistry();
}
}

和内存中的一个:

@Configuration
public class SpringInMemoryBatchConfiguration extends DefaultBatchConfigurer {
@Inject public SpringInMemoryBatchConfiguration() {
}
@Bean(name = "inMemoryJobLauncher")
public JobLauncher inMemoryJobLauncher() throws Exception {
return super.createJobLauncher();
}
@Bean(name = "inMemoryStepBuilderFactory")
public StepBuilderFactory stepBuilderFactory() {
return new StepBuilderFactory(super.getJobRepository(), super.getTransactionManager());
}
@Bean(name = "inMemoryJobBuilderFactory")
public JobBuilderFactory inMemoryJobBuilderFactory(){
return new JobBuilderFactory(super.getJobRepository());
}
}

当我想启动一个"持久"作业时,我使用@Qualifier(value = "persistentJobLauncher") JobLauncher launcher并启动一个在内存中的作业:@Qualifier(value = "inMemoryJobLauncher") JobLauncher launcher

  1. 有没有一种方法可以将第一类作业(如报表处理(的元数据保存在数据库中,而对第二类作业则完全不使用数据库持久性(如解锁用户帐户(

这是一个配置问题。您可以将Spring概要文件用于数据源。这个想法是定义一个持久的数据源和一个内存中的数据源。然后像往常一样使用数据源配置所有作业,并在运行时使用正确的配置文件运行它们。这里有一个快速的例子:

import javax.sql.DataSource;
import com.zaxxer.hikari.HikariDataSource;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
@Configuration
@EnableBatchProcessing
public class JobsConfiguration {
@Bean
public Job job1() {
return null;
}
@Bean
public Job job2() {
return null;
}
@Bean
@Profile("in-memory")
public DataSource embeddedDataSource() {
return new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.HSQL)
.addScript("/org/springframework/batch/core/schema-hsqldb.sql")
.build();
}
@Bean
@Profile("persistent")
public DataSource persistentDataSource() {
HikariDataSource hikariDataSource = new HikariDataSource();
// TODO configure datasource
return hikariDataSource;
}
}

如果使用-Dspring.profiles.active=in-memory运行应用程序,则应用程序上下文中只有嵌入的数据源bean,它将由@EnableBatchProcessing自动配置的作业存储库使用。

  1. 或者,对于第二种类型的作业,即使使用Spring Batch也会过于夸张/根本不需要吗?只需要一个带有@Scheduled注释的方法就足够了吗

which do not involve much of processing but a simple sql query:如果这是一个简单的sql查询,并且不需要持久化元数据,那么最好使用一个用@Scheduled注释的方法,该方法使用jdbcTemplate来运行查询。

最新更新