Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在spring批处理中压缩从数据库导出的CSV文件_Java_Spring Boot_Spring Batch - Fatal编程技术网

Java 在spring批处理中压缩从数据库导出的CSV文件

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启动应用程序后运行(没有配置启动器,只是因为
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
编辑了这个示例。