config
</>复制代码
@EnableBatchProcessing(modular = true)
@Configuration
public class BatchConfig {
private static final Logger LOGGER = LoggerFactory.getLogger(BatchConfig.class);
@Bean
public Job importUserJob(JobBuilderFactory jobs, Step s1, JobExecutionListener listener) {
return jobs.get("importUserJob")
.incrementer(new RunIdIncrementer())
.listener(listener)
.flow(s1)
.end()
.build();
}
@Bean
public Step step1(StepBuilderFactory stepBuilderFactory, ItemReader reader,
ItemWriter writer, ItemProcessor processor) {
return stepBuilderFactory.get("step1")
.chunk(5)
.reader(reader)
.processor(processor)
.writer(writer)
.build();
}
@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
@Bean
public ItemReader reader(DataSource dataSource) {
JdbcCursorItemReader reader = new JdbcCursorItemReader();
reader.setSql("select id, first_name, last_name, random_num from reader");
reader.setDataSource(dataSource);
reader.setRowMapper(
(ResultSet resultSet, int rowNum) -> {
LOGGER.info("RowMapper resultset: {}", resultSet);
if (!(resultSet.isAfterLast()) && !(resultSet.isBeforeFirst())) {
RecordSO recordSO = new RecordSO();
recordSO.setFirstName(resultSet.getString("first_name"));
recordSO.setLastName(resultSet.getString("last_name"));
recordSO.setId(resultSet.getLong("id"));
recordSO.setRandomNum(resultSet.getString("random_num"));
LOGGER.info("RowMapper record : {}", recordSO);
return recordSO;
} else {
LOGGER.info("Returning null from rowMapper");
return null;
}
});
return reader;
}
@Bean
public ItemPreparedStatementSetter setter() {
return (item, ps) -> {
ps.setLong(1, item.getId());
ps.setString(2, item.getFullName());
ps.setString(3, item.getRandomNum());
};
}
@Bean
public ItemProcessor processor() {
return new RecordProcessor();
}
@Bean
public ItemWriter writer(DataSource dataSource, ItemPreparedStatementSetter setter) {
JdbcBatchItemWriter writer = new JdbcBatchItemWriter<>();
writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider());
writer.setItemPreparedStatementSetter(setter);
writer.setSql("insert into writer (id, full_name, random_num) values (?,?,?)");
writer.setDataSource(dataSource);
return writer;
}
}
model
</>复制代码
@Entity
@Table(name = "reader")
public class RecordSO {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
private String firstName;
private String lastName;
private String randomNum;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getRandomNum() {
return randomNum;
}
public void setRandomNum(String randomNum) {
this.randomNum = randomNum;
}
}
@Entity
@Table(name = "writer")
public class WriterSO {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
private String fullName;
private String randomNum;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getFullName() {
return fullName;
}
public void setFullName(String fullName) {
this.fullName = fullName;
}
public String getRandomNum() {
return randomNum;
}
public void setRandomNum(String randomNum) {
this.randomNum = randomNum;
}
}
application.properties
</>复制代码
spring.datasource.driverClassName=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://192.168.99.100:5432/batch
spring.datasource.username=postgres
spring.datasource.password=mypwd
##spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.show-sql=true
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
processor
</>复制代码
public class RecordProcessor implements ItemProcessor {
private static final Logger LOGGER = LoggerFactory.getLogger(RecordProcessor.class);
@Override
public WriterSO process(RecordSO item) throws Exception {
LOGGER.info("Processing Record: {}", item);
WriterSO writerSo = new WriterSO();
writerSo.setId(item.getId());
writerSo.setFullName(item.getFirstName() + " " + item.getLastName());
writerSo.setRandomNum(String.valueOf(Math.random()).substring(3, 8));
LOGGER.info("Processed Writer: {}", writerSo);
return writerSo;
}
}
docs
spring-boot-batch-starter-example
spring-batch
spring-batch-admin-spring-boot
spring-batch-tutorial-with-spring-boot-and-java-configuration
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/65019.html
摘要:阿里云实例规格级别有哪些云服务器实例规格族可分为企业级实例规格族和入门级实例规格族。选购云服务器时,需要选择云服务器实例的规格信息实例规格族,也就是配置信息,实例规格族涉及到架构分类和应用场景等。阿里云ecs各实例规格名称的含义,实例规格是什么。 我们在了解和购买阿里云产品的时候,实例、实例规格是出现比较多的,所以有必要从概念和作用方面做个了解: 1、阿里云实例规格族包括哪些类型? (1)阿...
摘要:介绍是对模块的二次扩展提供时间格式化,时间计算的功能官方主页为地址为文件结构目录描述源文件源文件类的二次扩展类主要用于时差计算类的二次扩展类提供时间计算,格式化输出的功能自定义异常文件夹语言本地化文件夹类的方法会用到 介绍 Carbon是对PHP DateTime模块的二次扩展;提供时间格式化,时间计算的功能; 官方主页为 http://carbon.nesbot.com/; Git...
摘要:阿里云服务器必须要建实例吗,阿里云服务器实例。我们来看看这次阿里云的云服务器折活动有什么需要注意的阿里云云服务器折起的活动什么时候结束目前得到的信息是,首购折的活动是长期有效的哟。阿里云服务器必须要建实例吗,阿里云ecs服务器实例。 接触和使用阿里云服务器、阿里云数据库,我们对阿里云实例并不陌生,对于刚使用阿里云服务的亲来说,阿里云实例的基础知识可以做个了解: 1、什么是阿里云实例,阿里云实...
摘要:今天呢,服务器吧小编就给刚接触阿里云的新手小白带来快速入门阿里云服务器的方法。注册阿里云账号,并完成实名认证。教你如何格式化阿里云服务器数据盘第六步释放实例。相信阿里云服务器ECS已被广大的企业和个人站长所使用,但对于之前没有使用过阿里云服务器的新手小白来说,无疑是一头雾水。今天呢,服务器吧小编就给刚接触阿里云ECS的新手小白带来快速入门阿里云服务器的方法。请往下看! 第一步:完成准备工作...
阅读 4024·2021-11-24 09:38
阅读 1500·2021-11-19 09:40
阅读 2810·2021-11-18 10:02
阅读 3749·2021-11-09 09:46
阅读 1829·2021-09-22 15:27
阅读 3157·2019-08-29 15:24
阅读 1036·2019-08-29 12:40
阅读 1721·2019-08-28 18:24