Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.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批处理文件编写器直接写入amazon s3存储,无需PutObjectRequest_Java_Amazon Web Services_Amazon S3_Spring Batch - Fatal编程技术网

Java spring批处理文件编写器直接写入amazon s3存储,无需PutObjectRequest

Java spring批处理文件编写器直接写入amazon s3存储,无需PutObjectRequest,java,amazon-web-services,amazon-s3,spring-batch,Java,Amazon Web Services,Amazon S3,Spring Batch,我正在尝试将一个文件上载到AmazonS3。我不想上传,而是想使用SpringBatch从数据库读取数据,并将文件直接写入s3存储器。我们还可以这样做吗?支持Amazon S3服务使用资源加载程序和S3协议加载和写入资源。一旦完成,您就可以编写自定义Spring批处理编写器,如: import java.io.OutputStream; import java.util.List; import org.springframework.batch.item.ItemWriter; import

我正在尝试将一个文件上载到AmazonS3。我不想上传,而是想使用SpringBatch从数据库读取数据,并将文件直接写入s3存储器。我们还可以这样做吗?

支持Amazon S3服务使用资源加载程序和S3协议加载和写入资源。一旦完成,您就可以编写自定义Spring批处理编写器,如:

import java.io.OutputStream;
import java.util.List;

import org.springframework.batch.item.ItemWriter;
import org.springframework.core.io.ResourceLoader;
import org.springframework.core.io.WritableResource;

public class AwsS3ItemWriter implements ItemWriter<String> {

    private ResourceLoader resourceLoader;

    private WritableResource resource;

    public AwsS3ItemWriter(ResourceLoader resourceLoader, String resource) {
        this.resourceLoader = resourceLoader;
        this.resource = (WritableResource) this.resourceLoader.getResource(resource);
    }

    @Override
    public void write(List<? extends String> items) throws Exception {
        try (OutputStream outputStream = resource.getOutputStream()) {
            for (String item : items) {
                outputStream.write(item.getBytes());
            }
        }
    }
}
import java.io.OutputStream;
导入java.util.List;
导入org.springframework.batch.item.ItemWriter;
导入org.springframework.core.io.ResourceLoader;
导入org.springframework.core.io.WritableResource;
公共类AwsS3ItemWriter实现ItemWriter{
私有资源加载器;
私有可写资源;
公共AwsS3ItemWriter(ResourceLoader ResourceLoader,字符串资源){
this.resourceLoader=resourceLoader;
this.resource=(WritableResource)this.resourceLoader.getResource(resource);
}
@凌驾

public void write(List问题是,OutputStream将只写入步骤发送的最后一个列表项。。。 我认为您可能需要在文件系统中编写一个临时文件,然后在单独的tasklet中发送整个文件

请参见此示例:

我也有同样的事情要做。因为spring没有可以单独写入流的clas,所以我自己制作了一个类似上面示例的clas:

您需要为此创建一个类。一个实现WriteableResource并扩展AbstractResource的资源类:

以及扩展ItemWriter的编写器:

public class AmazonStreamWriter<T> implements ItemWriter<T>{

    private WritableResource resource;
    private LineAggregator<T> lineAggregator;
    private String lineSeparator;

    public String getLineSeparator() {
        return lineSeparator;
    }

    public void setLineSeparator(String lineSeparator) {
        this.lineSeparator = lineSeparator;
    }

    AmazonStreamWriter(WritableResource resource){
        this.resource = resource;
    }

    public WritableResource getResource() {
        return resource;
    }

    public void setResource(WritableResource resource) {
        this.resource = resource;
    }

    public LineAggregator<T> getLineAggregator() {
        return lineAggregator;
    }

    public void setLineAggregator(LineAggregator<T> lineAggregator) {
        this.lineAggregator = lineAggregator;
    }

    @Override
    public void write(List<? extends T> items) throws Exception {
        try (OutputStream outputStream = resource.getOutputStream()) {
                StringBuilder lines = new StringBuilder();
                Iterator var3 = items.iterator();

                while(var3.hasNext()) {
                    T item = (T) var3.next();
lines.append(this.lineAggregator.aggregate(item)).append(this.lineSeparator);
                }
                outputStream.write(lines.toString().getBytes());
        }
    }
}
公共类AmazonStreamWriter实现ItemWriter{
私有可写资源;
私人线路集线器;
专用字符串行分隔符;
公共字符串getLineSeparator(){
回流管分离器;
}
公共void setLineSeparator(字符串行分隔符){
this.lineSeparator=lineSeparator;
}
AmazonStreamWriter(可写资源){
这个资源=资源;
}
公共可写资源getResource(){
返回资源;
}
公共void setResource(WritableResource资源){
这个资源=资源;
}
public LineAggregator getLineAggregator(){
回流管集热器;
}
公共无效设置LineAggregator(LineAggregator LineAggregator){
this.lineAggregator=lineAggregator;
}
@凌驾

public void write(list)您必须在构造函数中获取输出蒸汽引用,然后它将写入所有项列表(所有块),如果您在write方法中有它,那么它将只打印最后一个分块的项查找相同的解决方案,但在2020年仍不会有太多结果。您是否能够了解如何在S3上流式传输到文件?您是否可以共享在写入器填充资源后将其传递到下一步的方式
public class AmazonStreamWriter<T> implements ItemWriter<T>{

    private WritableResource resource;
    private LineAggregator<T> lineAggregator;
    private String lineSeparator;

    public String getLineSeparator() {
        return lineSeparator;
    }

    public void setLineSeparator(String lineSeparator) {
        this.lineSeparator = lineSeparator;
    }

    AmazonStreamWriter(WritableResource resource){
        this.resource = resource;
    }

    public WritableResource getResource() {
        return resource;
    }

    public void setResource(WritableResource resource) {
        this.resource = resource;
    }

    public LineAggregator<T> getLineAggregator() {
        return lineAggregator;
    }

    public void setLineAggregator(LineAggregator<T> lineAggregator) {
        this.lineAggregator = lineAggregator;
    }

    @Override
    public void write(List<? extends T> items) throws Exception {
        try (OutputStream outputStream = resource.getOutputStream()) {
                StringBuilder lines = new StringBuilder();
                Iterator var3 = items.iterator();

                while(var3.hasNext()) {
                    T item = (T) var3.next();
lines.append(this.lineAggregator.aggregate(item)).append(this.lineSeparator);
                }
                outputStream.write(lines.toString().getBytes());
        }
    }
}