Я использую Java SDK 1.11.534
В моем инструменте я объявил загрузку с именем «down», используя TransferManager
,
с момента звонка:
down.waitForCompletion();
является блокирующим вызовом и останавливает подтверждение ProgressBar
на ProgressListener
Мне пришлось ввести SwingWorker
следующим образом:
SwingWorker worker = new SwingWorker<Void,Integer>(){
@Override
protected void process(List<Integer> chunks) {
int j = chunks.get(chunks.size()-1);
if (i<=fileNum) jLabel4.setText("Scaricamento file " + i+ " di " + fileNum + " del DCP "+ DCPname+" in corso, attendere....");
else jLabel4.setText("Scaricamento DCP "+ DCPname+" completato con successo.");
}
@Override
protected Void doInBackground(){
for (S3ObjectSummary file: fileList){
if((!isPresent(destination,file.getKey().substring(file.getKey().lastIndexOf("/") + 1),file.getSize())) && (!(file.getKey().substring(0, file.getKey().length()-1).equals(DCPname)))){
publish(i);
GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, file.getKey());
down = tx.download(getObjectRequest,new File(percorso+File.separator + file.getKey().substring(file.getKey().lastIndexOf("/") + 1)));
down.addProgressListener(progressListener);
try {
down.waitForCompletion();
} catch (AmazonClientException ex) {
ex.printStackTrace();
tx.shutdownNow(true);
//jButton4.setEnabled(true);
jButton4.doClick();
} catch (InterruptedException ex) {
ex.printStackTrace();
tx.shutdownNow(true);
//jButton4.setEnabled(true);
jButton4.doClick();
}
i++;
}
Это часть кода, где doInBackground()
показывает операции, которые нужно выполнить.
Иногда бывает, что AmazonClientException
сообщает:
Не все байты из S3inputstream были прочитаны
И это приводит к повреждению файла и остановке самой программы при исключении.
В начале моего кода (здесь не сообщается) до достижения декларации SwingWorker
я заявил, что при нажатии jButton4
действие начинает проверять, есть ли несоответствие размера между файлами в папке загрузки и файлами на Amazon s3, и если есть усеченный файл, он удаляется, и имя снова добавляется в список загрузки.
Итак, единственное решение, которое я нашел на данный момент, это добавить следующий строчный код:
jButton4.doClick();
В коде исключения, означающем, что при попадании в исключение, процесс перезапускается, проверяет усеченные файлы и перезапускает загрузки, добавляя такой файл тоже.
Мой вопрос:
Есть ли в SDK какой-либо способ возобновить или лучше отменить, а затем загрузить файл после исключения без перезапуска программы? Я нахожу использование:
jButton4.doClick();
не профессиональный способ кодирования.