package com.neverwinterdp.scribengin.storage.s3.sink; import java.io.IOException; import java.util.UUID; import com.amazonaws.services.s3.model.ObjectMetadata; import com.neverwinterdp.scribengin.Record; import com.neverwinterdp.scribengin.storage.s3.S3Folder; import com.neverwinterdp.scribengin.storage.s3.S3ObjectWriter; import com.neverwinterdp.scribengin.storage.sink.SinkStreamWriter; import com.neverwinterdp.util.JSONSerializer; public class S3SinkStreamWriter implements SinkStreamWriter { private S3Folder streamS3Folder ; private String segmentName ; private S3ObjectWriter writer ; public S3SinkStreamWriter(S3Folder streamS3Folder) throws IOException { this.streamS3Folder = streamS3Folder; segmentName = "segment-" + UUID.randomUUID().toString(); ObjectMetadata metadata = new ObjectMetadata(); metadata.setContentType("application/binary"); metadata.addUserMetadata("transaction", "prepare"); writer = streamS3Folder.createObjectWriter(segmentName, metadata) ; } @Override public void append(Record record) throws Exception { byte[] bytes = JSONSerializer.INSTANCE.toBytes(record) ; writer.write(bytes); } @Override public void prepareCommit() throws Exception { writer.waitAndClose(1 * 60 * 1000); } @Override public void completeCommit() throws Exception { ObjectMetadata metadata = writer.getObjectMetadata(); metadata.addUserMetadata("transaction", "complete"); streamS3Folder.updateObjectMetadata(segmentName, metadata); } @Override public void commit() throws Exception { prepareCommit(); completeCommit(); } @Override public void rollback() throws Exception { } @Override public void close() throws Exception { } }