发生异常后恢复上次下载的文件

时间:2019-04-18 07:09:44

标签: java exception amazon-s3 download

我正在使用Java SDK 1.11.534

在我的工具中,我使用TransferManager声明了名为“下载”的下载,

通话以来:

down.waitForCompletion();

是一个阻止呼叫,并停止ProgressBar的{​​{1}}确认,我必须按如下方式介绍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()报告:

  

并非所有来自S3inputstream的字节都被读取

这会导致文件损坏,并在出现异常时停止程序本身。

在到达AmazonClientException声明之前,在代码的开头(此处未报告),我说过,单击SwingWorker时,动作开始检查下载的文件之间是否存在大小不匹配的情况文件夹和Amazon s3上的文件夹,如果文件被截断,它将被删除,并且名称会再次添加到下载列表中。

因此,到目前为止,我发现的唯一解决方案是添加以下行代码:

jButton4

在异常代码中,这意味着在遇到异常时,进度将重新启动并检查被截断的文件,并重新开始下载,并添加此类文件。

我的问题是:

SDK中是否有任何方法可以恢复或更好地取消,然后在异常情况下再次下载文件而无需重新启动程序?我发现以下用途:

jButton4.doClick();

不是专业的编码方式。

1 个答案:

答案 0 :(得分:0)

您可以将click action方法的内容提取到新方法中,然后调用该方法。