Я получаю 20 КБ небольших XML-файлов размером от 1 КБ до 3 КБ в минуту.Мне нужно записать все файлы по мере поступления в каталог.
Иногда скорость входящих файлов увеличивается до 100 КБ в минуту.Есть ли что-нибудь в java или aws api, которое может помочь мне соответствовать скорости входящего?
Я использую uploadFileList()
API для загрузки всех файлов.Я также пробовал смотреть событие, чтобы при поступлении файлов в папку он загружал этот файл в S3, но это было слишком медленно по сравнению с входящими файлами и создавало огромное количество невыполненных заданий.
Я пробовал многопоточностьтакже, но если я раскручиваю больше потока, я получаю ошибку от S3 reduce you request rate error.
, и иногда я получаю ошибку ниже также
AmazonServiceException: com.amazonaws.services.s3.model.AmazonS3Exception: Ваше соединение сокетана сервер не был прочитан или записан в течение периода ожидания.Свободные соединения будут закрыты.
, но когда я не использую многопоточность, я не получаю эту ошибку
Другой способ, который я также пробовал, - создать один большой файл и затем загрузить его в S3.и затем в S3 я снова разделяю его на небольшие файлы, что хорошо, но это решение задерживает загрузку файлов в S3 и влияет на пользователя, который обращается к этому файлу из S3.
Я знаю, что загрузка небольших файлов в S3 не подходитно у меня есть такой пример использования.
Скорость, которую я заметил, равна 5k загрузки файлов за минуты.
Может кто-нибудь предложить какой-нибудь альтернативный способ, чтобы моя скорость загрузки файлов увеличилась минимум на 15kв минуту.
Я делюсь своим полным кодом, где я пытаюсь загрузить, используя многопоточное приложение
Первый класс, где я создаю файл для добавления в поток
public class FileProcessThreads {
public ArrayList process(String fileLocation) {
File dir = new File(fileLocation);
File[] directoryListing = dir.listFiles();
ArrayList<File> files = new ArrayList<File>();
if (directoryListing.length > 0) {
for (File path : directoryListing) {
files.add(path);
}
}
return files;
}
}
Класс 2, где я создаю пул потоков и Исполнитель
public class UploadExecutor {
private static String fileLocation = "C:\\Users\\u6034690\\Desktop\\ONEFILE";
// private static String fileLocation="D:\\TRFAudits_Moved\\";
private static final String _logFileName = "s3FileUploader.log";
private static Logger _logger = Logger.getLogger(UploadExecutor.class);
@SuppressWarnings("unchecked")
public static void main(String[] args) {
_logger.info("----------Stating application's main method----------------- ");
AWSCredentials credential = new ProfileCredentialsProvider("TRFAuditability-Prod-ServiceUser").getCredentials();
final ClientConfiguration config = new ClientConfiguration();
AmazonS3Client s3Client = (AmazonS3Client) AmazonS3ClientBuilder.standard().withRegion("us-east-1")
.withCredentials(new AWSStaticCredentialsProvider(credential)).withForceGlobalBucketAccessEnabled(true)
.build();
s3Client.getClientConfiguration().setMaxConnections(100);
TransferManager tm = new TransferManager(s3Client);
while (true) {
FileProcessThreads fp = new FileProcessThreads();
List<File> records = fp.process(fileLocation);
while (records.size() <= 0) {
try {
_logger.info("No records found willl wait for 10 Seconds");
TimeUnit.SECONDS.sleep(10);
records = fp.process(fileLocation);
} catch (InterruptedException e) {
_logger.error("InterruptedException: " + e.toString());
}
}
_logger.info("Total no of Audit files = " + records.size());
ExecutorService es = Executors.newFixedThreadPool(2);
int recordsInEachThread = (int) (records.size() / 2);
_logger.info("No of records in each thread = " + recordsInEachThread);
UploadObject my1 = new UploadObject(records.subList(0, recordsInEachThread), tm);
UploadObject my2 = new UploadObject(records.subList(recordsInEachThread, records.size()), tm);
es.execute(my1);
es.execute(my2);
es.shutdown();
try {
boolean finshed = es.awaitTermination(1, TimeUnit.MINUTES);
if (!finshed) {
Thread.sleep(1000);
}
} catch (InterruptedException e) {
_logger.error("InterruptedException: " + e.toString());
}
}
}
}
Последний класс, в который я загружаю файлы в S3
public class UploadObject implements Runnable{
static String bucketName = "a205381-auditxml/S3UPLOADER";
private String fileLocation="C:\\Users\\u6034690\\Desktop\\ONEFILE";
//private String fileLocation="D:\\TRFAudits\\";
//static String bucketName = "a205381-auditxml/S3UPLOADER";
private static Logger _logger;
List<File> records;
TransferManager tm;
UploadObject(List<File> list,TransferManager tm){
this.records = list;
this.tm=tm;
_logger = Logger.getLogger(UploadObject.class);
}
public void run(){
System.out.println(Thread.currentThread().getName() + " : ");
uploadToToS3();
}
public void uploadToToS3() {
_logger.info("Number of record to be processed in current thread: : "+records.size());
MultipleFileUpload xfer = tm.uploadFileList(bucketName, "TEST",new File(fileLocation), records);
try {
xfer.waitForCompletion();
TransferState xfer_state = xfer.getState();
_logger.info("Upload status -----------------" + xfer_state);
for (File file : records) {
try {
Files.delete(FileSystems.getDefault().getPath(file.getAbsolutePath()));
} catch (IOException e) {
System.exit(1);
_logger.error("IOException: "+e.toString());
}
}
_logger.info("Successfully completed file cleanse");
} catch (AmazonServiceException e) {
_logger.error("AmazonServiceException: "+e.toString());
System.exit(1);
} catch (AmazonClientException e) {
_logger.error("AmazonClientException: "+e.toString());
System.exit(1);
} catch (InterruptedException e) {
_logger.error("InterruptedException: "+e.toString());
System.exit(1);
}
System.out.println("Completed");
_logger.info("Upload completed");
_logger.info("Calling Transfer manager shutdown");
//tm.shutdownNow();
}
}