Java spring批处理文件编写器直接写入amazon s3存储,无需PutObjectRequest
我正在尝试将一个文件上载到AmazonS3。我不想上传,而是想使用SpringBatch从数据库读取数据,并将文件直接写入s3存储器。我们还可以这样做吗?支持Amazon S3服务使用资源加载程序和S3协议加载和写入资源。一旦完成,您就可以编写自定义Spring批处理编写器,如: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
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());
}
}
}