Java 在spring批处理中压缩从数据库导出的CSV文件
我有一个批在启动spring启动应用程序后运行(没有配置启动器,只是因为Java 在spring批处理中压缩从数据库导出的CSV文件,java,spring-boot,spring-batch,Java,Spring Boot,Spring Batch,我有一个批在启动spring启动应用程序后运行(没有配置启动器,只是因为spring.batch.job.enabled=true我的作业正在运行)。 我的工作目标是从数据库导出csv文件 我想在创建CSV文件后压缩此文件。 在哪一步我可以压缩它,我在itemWriter中试过,压缩的文件是空的 我的源代码是: @Bean public FlatFileItemWriter<User> writer(){ log.info("start writing user ... ")
spring.batch.job.enabled=true
我的作业正在运行)。
我的工作目标是从数据库导出csv文件
我想在创建CSV文件后压缩此文件。
在哪一步我可以压缩它,我在itemWriter中试过,压缩的文件是空的
我的源代码是:
@Bean
public FlatFileItemWriter<User> writer(){
log.info("start writing user ... ");
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT).withZone(ZoneId.systemDefault());
Instant instant = Instant.now();
date = formatter.format(instant);
date = date.replaceAll("[/,\\s,:]", "-");
FlatFileItemWriter<User> writer = new FlatFileItemWriter<User>();
filePath = config.getPath + date + ".csv";
writer.setResource(new FileSystemResource (filePath));
writer.setAppendAllowed(true);
writer.setLineAggregator(new DelimitedLineAggregator<User>() {
{
setDelimiter(",");
setFieldExtractor(new BeanWrapperFieldExtractor<User>() {
{
setNames(new String[] { "Id", "Name" });
}
});
}
});
writer.close();
try {
File file = new File(config.getPath() + "\\" + date + ".zip");
ZipOutputStream zop = new ZipOutputStream(new FileOutputStream (file));
ZipEntry entry = new ZipEntry(filePath);
zop.putNextEntry(entry);
zop.close();
} catch (Exception e) {
e.printStackTrace();
}
return writer;
}
@Bean
公共FlatFileItemWriter编写器(){
log.info(“开始写入用户…”);
DateTimeFormatter formatter=DateTimeFormatter.OfCalizedDateTime(FormatStyle.SHORT).withZone(ZoneId.systemDefault());
Instant-Instant=Instant.now();
日期=格式化程序。格式化(即时);
日期=日期.replaceAll(“[/,\\s,:]”,“-”;
FlatFileItemWriter writer=新的FlatFileItemWriter();
filePath=config.getPath+date+“.csv”;
setResource(新文件系统资源(文件路径));
writer.setAppendAllowed(true);
writer.setLineAggregator(新的DelimitedLineAggregator(){
{
setDelimiter(“,”);
setFieldExtractor(新BeanWrapperFieldExtractor(){
{
集合名(新字符串[]{“Id”,“Name”});
}
});
}
});
writer.close();
试一试{
File File=新文件(config.getPath()+“\\”+date+“.zip”);
ZipOutputStream zop=newzipoutpstream(newfileoutputstream(file));
ZipEntry条目=新ZipEntry(文件路径);
zop.putNextEntry(条目);
zop.close();
}捕获(例外e){
e、 printStackTrace();
}
返回作者;
}
在哪一步我可以压缩它,我在itemWriter中试过,压缩的文件是空的
您需要创建两个步骤:
- 创建文件的人(面向块的步骤)
- 另一个拉链(tasklet步骤)
编写器。关闭,Spring Batch将作为编写器生命周期的一部分执行此操作。您需要做的是声明类型为ItemWriter
的bean,并将压缩代码移动到不同的步骤。例如:
@Bean
public JdbcCursorItemReader<User> jdbcCursorItemReader() {
// define and return the reader
}
@Bean
public FlatFileItemWriter<User> writer(){
log.info("start writing user ... ");
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT).withZone(ZoneId.systemDefault());
Instant instant = Instant.now();
date = formatter.format(instant);
date = date.replaceAll("[/,\\s,:]", "-");
FlatFileItemWriter<User> writer = new FlatFileItemWriter<User>();
filePath = config.getPath + date + ".csv";
writer.setResource(new FileSystemResource (filePath));
writer.setAppendAllowed(true);
writer.setLineAggregator(new DelimitedLineAggregator<User>() {
{
setDelimiter(",");
setFieldExtractor(new BeanWrapperFieldExtractor<User>() {
{
setNames(new String[] { "Id", "Name" });
}
});
}
});
return writer;
}
@Bean
public Step exportFile() {
return stepBuilderFactory.get("exportFile")
.chunk(100)
.reader(jdbcCursorItemReader())
.writer(writer())
.build();
}
@Bean
public Step compressFile() {
return stepBuilderFactory.get("compressFile")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
try {
File file = new File(config.getPath() + "\\" + date + ".zip");
ZipOutputStream zop = new ZipOutputStream(new FileOutputStream (file));
ZipEntry entry = new ZipEntry(filePath);
zop.putNextEntry(entry);
zop.close();
} catch (Exception e) {
e.printStackTrace();
}
return RepeatStatus.FINISHED;
}
});
}
@Bean
公共JdbcCursorItemReader JdbcCursorItemReader(){
//定义并返回读取器
}
@豆子
公共FlatFileItemWriter编写器(){
log.info(“开始写入用户…”);
DateTimeFormatter formatter=DateTimeFormatter.OfCalizedDateTime(FormatStyle.SHORT).withZone(ZoneId.systemDefault());
Instant-Instant=Instant.now();
日期=格式化程序。格式化(即时);
日期=日期.replaceAll(“[/,\\s,:]”,“-”;
FlatFileItemWriter writer=新的FlatFileItemWriter();
filePath=config.getPath+date+“.csv”;
setResource(新文件系统资源(文件路径));
writer.setAppendAllowed(true);
writer.setLineAggregator(新的DelimitedLineAggregator(){
{
setDelimiter(“,”);
setFieldExtractor(新BeanWrapperFieldExtractor(){
{
集合名(新字符串[]{“Id”,“Name”});
}
});
}
});
返回作者;
}
@豆子
公共步骤导出文件(){
返回stepBuilderFactory.get(“exportFile”)
.chunk(100)
.reader(jdbcCursorItemReader())
.writer(writer())
.build();
}
@豆子
公共步骤压缩文件(){
返回stepBuilderFactory.get(“compressFile”)
.tasklet(新的tasklet(){
@凌驾
public RepeatStatus execute(StepContribution贡献,ChunkContext ChunkContext)引发异常{
试一试{
File File=新文件(config.getPath()+“\\”+date+“.zip”);
ZipOutputStream zop=newzipoutpstream(newfileoutputstream(file));
ZipEntry条目=新ZipEntry(文件路径);
zop.putNextEntry(条目);
zop.close();
}捕获(例外e){
e、 printStackTrace();
}
返回RepeatStatus.FINISHED;
}
});
}
然后按照正确的顺序使用这些步骤定义作业。您只将文件路径作为名称添加到zipentry中,但没有实际数据,因此文件为空。非常感谢您的回答。我真的很喜欢。仅适用于step压缩文件。你的意思是使用StepBuilderFactory吗。StepBuilder(“压缩文件”)未知。是的,请使用StepBuilderFactory
。我刚刚用StepBuilder
编写了示例,向您展示了如何继续。我用StepBuilderFactory
编辑了这个示例。