在 Spring 启动应用程序中嵌入 Spring 带有作业定义的批处理管理
Embedding Spring Batch Admin with job definitions in Spring Boot app
我按照示例将 Spring Batch Admin 运行 作为启动应用 spring-batch-admin-spring-boot
按预期工作。我添加了一个名为 BatchConfiguration 的新配置,定义如下:
package spring.batch.jobs;
... imports ...
@Configuration
public class BatchConfiguration {
@Autowired
private Environment env;
@Autowired
public PlatformTransactionManager transactionManager;
@Autowired
public JobRepository jobRepository;
@Autowired
public JobBuilderFactory jobBuilderFactory;
@Autowired
public StepBuilderFactory stepBuilderFactory;
@Autowired
public DataSource dataSource;
@Bean
public PlatformTransactionManager transactionManager(DataSource ds) {
return new DataSourceTransactionManager(ds);
}
@Bean
public StepBuilderFactory makeStepBuilderFactory() {
return new StepBuilderFactory(jobRepository, transactionManager);
}
@Bean
public JobRepository createJobRepository() throws Exception {
JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean();
factory.setDataSource(dataSource);
factory.setTransactionManager(transactionManager);
String isolationLevelForCreate = env.getProperty("batch.repository.isolationlevelforcreate");
if (isolationLevelForCreate != null) {
factory.setIsolationLevelForCreate(isolationLevelForCreate);
}
String tablePrefix = env.getProperty("batch.repository.tableprefix");
if (tablePrefix != null) {
factory.setTablePrefix(tablePrefix);
}
factory.afterPropertiesSet();
return factory.getObject();
}
@Bean
public JobBuilderFactory makeJobBuilderFactory() {
return new JobBuilderFactory(jobRepository);
}
@Bean
public DataSource dataSource(Environment e) {
org.apache.tomcat.jdbc.pool.DataSource ds = new org.apache.tomcat.jdbc.pool.DataSource();
ds.setDriverClassName(e.getProperty("batch.jdbc.driver"));
ds.setUsername(e.getProperty("batch.jdbc.user"));
ds.setPassword(e.getProperty("batch.jdbc.password"));
ds.setUrl(e.getProperty("batch.jdbc.url"));
return ds;
}
// tag::readerwriterprocessor[]
@Bean
public FlatFileItemReader<Person> reader() {
FlatFileItemReader<Person> reader = new FlatFileItemReader<Person>();
reader.setResource(new ClassPathResource("sample-data.csv"));
reader.setLineMapper(new DefaultLineMapper<Person>() {{
setLineTokenizer(new DelimitedLineTokenizer() {{
setNames(new String[]{"firstName", "lastName"});
}});
setFieldSetMapper(new BeanWrapperFieldSetMapper<Person>() {{
setTargetType(Person.class);
}});
}});
return reader;
}
@Bean
public PersonItemProcessor processor() {
return new PersonItemProcessor();
}
@Bean
public JdbcBatchItemWriter<Person> writer() {
JdbcBatchItemWriter<Person> writer = new JdbcBatchItemWriter<Person>();
writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<Person>());
writer.setSql("INSERT INTO people (first_name, last_name) VALUES (:firstName, :lastName)");
writer.setDataSource(dataSource);
return writer;
}
// end::readerwriterprocessor[]
// tag::jobstep[]
@Bean
public Job importUserJob() {
return jobBuilderFactory.get("importUserJob")
.incrementer(new RunIdIncrementer())
.flow(step1())
.end()
.build();
}
@Bean
public Step step1() {
return stepBuilderFactory.get("step1")
.<Person, Person>chunk(10)
.reader(reader())
.processor(processor())
.writer(writer())
.build();
}
// end::jobstep[]
}
然后我通过将 class 添加到导入注释将此配置导入 MainConfiguration。
启动应用程序后,我没有看到工作页面下列出的 importUserJob
。如何使用 spring 批处理管理员正确注册我的作业,以便它在 UI?
中列出并可运行
通过将以下内容添加到 main/resources/META-INF/spring/batch/jobs/myjob.xml
,我能够在 spring 批处理管理员中注册我的项目中定义的作业
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/batch http://www.springframework.org/schema/batch/spring-batch.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd">
<context:annotation-config/>
<context:component-scan base-package="spring.batch.jobs"/>
</beans>
这好像告诉应用程序上下文spring.batch.jobs
包下有注解配置类需要注册
我按照示例将 Spring Batch Admin 运行 作为启动应用 spring-batch-admin-spring-boot
按预期工作。我添加了一个名为 BatchConfiguration 的新配置,定义如下:
package spring.batch.jobs;
... imports ...
@Configuration
public class BatchConfiguration {
@Autowired
private Environment env;
@Autowired
public PlatformTransactionManager transactionManager;
@Autowired
public JobRepository jobRepository;
@Autowired
public JobBuilderFactory jobBuilderFactory;
@Autowired
public StepBuilderFactory stepBuilderFactory;
@Autowired
public DataSource dataSource;
@Bean
public PlatformTransactionManager transactionManager(DataSource ds) {
return new DataSourceTransactionManager(ds);
}
@Bean
public StepBuilderFactory makeStepBuilderFactory() {
return new StepBuilderFactory(jobRepository, transactionManager);
}
@Bean
public JobRepository createJobRepository() throws Exception {
JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean();
factory.setDataSource(dataSource);
factory.setTransactionManager(transactionManager);
String isolationLevelForCreate = env.getProperty("batch.repository.isolationlevelforcreate");
if (isolationLevelForCreate != null) {
factory.setIsolationLevelForCreate(isolationLevelForCreate);
}
String tablePrefix = env.getProperty("batch.repository.tableprefix");
if (tablePrefix != null) {
factory.setTablePrefix(tablePrefix);
}
factory.afterPropertiesSet();
return factory.getObject();
}
@Bean
public JobBuilderFactory makeJobBuilderFactory() {
return new JobBuilderFactory(jobRepository);
}
@Bean
public DataSource dataSource(Environment e) {
org.apache.tomcat.jdbc.pool.DataSource ds = new org.apache.tomcat.jdbc.pool.DataSource();
ds.setDriverClassName(e.getProperty("batch.jdbc.driver"));
ds.setUsername(e.getProperty("batch.jdbc.user"));
ds.setPassword(e.getProperty("batch.jdbc.password"));
ds.setUrl(e.getProperty("batch.jdbc.url"));
return ds;
}
// tag::readerwriterprocessor[]
@Bean
public FlatFileItemReader<Person> reader() {
FlatFileItemReader<Person> reader = new FlatFileItemReader<Person>();
reader.setResource(new ClassPathResource("sample-data.csv"));
reader.setLineMapper(new DefaultLineMapper<Person>() {{
setLineTokenizer(new DelimitedLineTokenizer() {{
setNames(new String[]{"firstName", "lastName"});
}});
setFieldSetMapper(new BeanWrapperFieldSetMapper<Person>() {{
setTargetType(Person.class);
}});
}});
return reader;
}
@Bean
public PersonItemProcessor processor() {
return new PersonItemProcessor();
}
@Bean
public JdbcBatchItemWriter<Person> writer() {
JdbcBatchItemWriter<Person> writer = new JdbcBatchItemWriter<Person>();
writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<Person>());
writer.setSql("INSERT INTO people (first_name, last_name) VALUES (:firstName, :lastName)");
writer.setDataSource(dataSource);
return writer;
}
// end::readerwriterprocessor[]
// tag::jobstep[]
@Bean
public Job importUserJob() {
return jobBuilderFactory.get("importUserJob")
.incrementer(new RunIdIncrementer())
.flow(step1())
.end()
.build();
}
@Bean
public Step step1() {
return stepBuilderFactory.get("step1")
.<Person, Person>chunk(10)
.reader(reader())
.processor(processor())
.writer(writer())
.build();
}
// end::jobstep[]
}
然后我通过将 class 添加到导入注释将此配置导入 MainConfiguration。
启动应用程序后,我没有看到工作页面下列出的 importUserJob
。如何使用 spring 批处理管理员正确注册我的作业,以便它在 UI?
通过将以下内容添加到 main/resources/META-INF/spring/batch/jobs/myjob.xml
,我能够在 spring 批处理管理员中注册我的项目中定义的作业<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/batch http://www.springframework.org/schema/batch/spring-batch.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd">
<context:annotation-config/>
<context:component-scan base-package="spring.batch.jobs"/>
</beans>
这好像告诉应用程序上下文spring.batch.jobs
包下有注解配置类需要注册