2011-10-07 2 views
2

I amazonS3에 멀티 업로드를 할 수있는 다음과 같은 방법이 있습니다RejectedExecutionException AWS TransferManager를 사용하는 경우

public static void uploadToS3UserPath(String filePath, String bucket, String userPath) { 
    ClientConfiguration config = new ClientConfiguration(); 
    config.setProxyHost("host"); 
    config.setProxyPort(3128); 
    config.setProtocol(Protocol.HTTP); 

    TransferManager tm = new TransferManager(new AmazonS3Client(credentials, config)); 
    TransferManagerConfiguration conf = new TransferManagerConfiguration(); 
    conf.setMinimumUploadPartSize(50 * 1024 * 1024); //use 50 megabytes parts; 
    tm.setConfiguration(conf); 

    PutObjectRequest req = new PutObjectRequest(bucket, userPath, new File(filePath)); 
    req.setCannedAcl(CannedAccessControlList.PublicRead); 
    req.setStorageClass(StorageClass.ReducedRedundancy); //we do it to decrease storage costs 
    Upload up = tm.upload(req); 

    try { 
     up.waitForCompletion(); 
     tm.shutdownNow(); 
     System.out.println("Upload completed successfully"); 
    } catch (AmazonClientException ex) { 
     Logger.getLogger(Utilities.class.getName()).log(Level.SEVERE, ex.getLocalizedMessage(), ex); 
     tm.shutdownNow(); 
    } catch (InterruptedException ex) { 
     Logger.getLogger(Utilities.class.getName()).log(Level.SEVERE, ex.getLocalizedMessage(), ex); 
    } 
} 

것은 가끔 내가 갖는된다

com.amazonaws.AmazonClientException: Unable to complete transfer: null 
      at 
    com.amazonaws.services.s3.transfer.Transfer.unwrapExecutionException(Transfer.java:226) 
      at 
    com.amazonaws.services.s3.transfer.Transfer.rethrowExecutionException(Transfer.java:210) 
      at 
    com.amazonaws.services.s3.transfer.Transfer.waitForCompletion(Transfer.java:116) 
      at 
    xx.xxx.xxx.xxx.agent.Utilities.uploadToS3UserPath(Utilities.java:373) 
      at 
    xx.xxx.xxx.xxx.agent.AbstractAgent.uploadOutputToS3(AbstractAgent.java:312) 
      at 
    uk.org.infectogenomics.agent.AbstractAgent.uploadOutputToS3(AbstractAgent.java:305) 
      at xx.xxx.xxx.xxx.hostEl.HostEl.run(HostEl.java:598) 
      at xx.xxx.xxx.xxx.agent.Agent.main(Agent.java:98) 
    Caused by: java.util.concurrent.RejectedExecutionException 
      at 
    java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:1759) 
      at 
    java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:767) 
      at 
    java.util.concurrent.ScheduledThreadPoolExecutor.delayedExecute(ScheduledThreadPoolExecutor.java:216) 
      at 
    java.util.concurrent.ScheduledThreadPoolExecutor.schedule(ScheduledThreadPoolExecutor.java:378) 
      at 
    com.amazonaws.services.s3.transfer.internal.UploadMonitor.reschedule(UploadMonitor.java:210) 
      at 
    com.amazonaws.services.s3.transfer.internal.UploadMonitor.upload(UploadMonitor.java:197) 
      at 
    com.amazonaws.services.s3.transfer.internal.UploadMonitor.call(UploadMonitor.java:148) 
      at 
    com.amazonaws.services.s3.transfer.internal.UploadMonitor.call(UploadMonitor.java:49) 
      at 
    java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) 
      at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
      at 
    java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885) 
      at 
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907) 
      at java.lang.Thread.run(Thread.java:619) 

것은 내가 아무 생각입니다 왜 이것이 임의 업로드에서만 나타나는 지 분명히 이유는 RejectedExecutionException입니까? TransferManager를 중간에 종료했기 때문일 수 있습니까?

+0

무슨 일이 있었는지 알아 냈습니까? –

+0

멀티 스레드 구현을 사용하면 궁극적으로 제대로 된 API가 있다는 사실과 상관없이 올바르게 진행되기가 어렵습니다. 대신에 uploadrequest를 사용하여 단일 스레드 버전을 사용하도록 되돌 렸습니다. ja.net을 사용하고 있기 때문에 클라우드에 대한 연결성이 좋기 때문에 아마존에 몇 개의 공연 파일을 전송하는 것은별로 중요하지 않습니다. – LordDoskias

답변

0

TransferManager를 중간에 종료했기 때문일 수 있습니까? 실제로이 동작에 대한 트리거하지만 근본 원인은 AWS SDK for Java에 버그가 있었다

, 에릭 밀라 비슷한 질문 Amazon AWS Java SDK TransferManager issue 참조 : TransferManager가 UploadMonitor 포함

및 UploadMonitor는 정적 ScheduledExecutorService를있다 timedThreadPoool이라고합니다. TransferManager.shutdownNow()가 timedThreadPoool.shutdownNow()를 호출하는 정적 메서드 UploadMonitor.shutdownNow()를 호출합니다. 다음에 UploadMonitor.reschedule() 호출이 발생하면 RejectedExecutionException이 입니다.

His own answer 언급이 버그 확인 TransferManager Thread Issue에 AWS 팀 응답하고, 각각의 수정) Release 1.3.2의으로서 구현되었습니다

Amazon S3 TransferManager class 개의 버그 해결하기 위해 업데이트되었습니다

업로드의 특정 부분에서 InputStream 및 에서 IO 오류가 발생할 때 데이터가 손상 될 수 있습니다. 깨끗하게 TransferManager의 인스턴스에서 shutdownNow()가 호출 될 때 타이머 스레드 종료