2013-04-18 2 views
1

.NET 고급 API 용 AWS SDK를 사용하여 26MB 크기의 파일을 Amazon Glacier에 업로드하는 샘플 애플리케이션이 있습니다. 코드 스레딩없이 잘 작동하지만 스레드 풀과는 오류 메시지를 말하는 아래 라인Amazon Glacier 병렬 아카이브 업로드

  client.UploadMultipartPart(uploadMPUrequest); 

에 실패 요청이 중단되었습니다 : 요청이 취소되었습니다.

스택 추적 :에서 Amazon.Runtime.AmazonWebServiceClient.InvokeConfiguredRequest에서 Amazon.Runtime.AmazonWebServiceClient.getRequestStreamCallback (IAsyncResult를 결과) 에서 Amazon.Runtime.AmazonWebServiceClient.handleHttpWebErrorResponse (AsyncResult asyncResult, WebException이 우리) (AsyncResult asyncResult) 에서 Amazon.Runtime.AmazonWebServiceClient.InvokeHelper (asyncResult asyncResult) Amazon.Glacier.AmazonGlacierClient.invokeUploadMultipartPart에서 Amazon.Runtime.AmazonWebServiceClient.Invoke (asyncResult asyncResult) 에서 아마존에서 (uploadMultipartPartRequest uploadMultipartPartRequest, AsyncCallback 콜백은, 주, 부울 동기화 된 객체). Glacier.AmazonGlacierClient.UploadMultipartPa RT (UploadMultipartPartRequest uploadMultipartPartRequest)

참고 : 나는 여러 부분에서 데이터를 업로드하고

내 샘플 코드에 대한 아래 링크를 찾아주십시오 : 아카이브의 병렬 업로드에 대한 샘플 코드 www.page-monitor.com/Downloads/ArchiveUploadMPU.cs

거기를?

감사와 안부, Haseena

+0

Google 검색 결과는 어쩌면 질문에 대한 답변을 얻을 수 있습니다. https://github.com/athomason/ParallelGlacierUploader 편집 : 오, 방금 C# 질문, 신경 쓰지 마시고 – RuntimeError

+0

안녕하세요. 실제로 도움이되었습니다. 이제 저는 아카이브를 빙하로 업로드 할 수 있습니다. 다시 한 번 감사드립니다! –

+0

아무 문제 없습니다, google은 당신의 친구입니다.) – RuntimeError

답변

0

다음은 스레딩에서 잘 작동하는 샘플 코드입니다. ChunkDetails는 accessID, bucketname, offset 세부 정보 등을 전달하기위한 맞춤 라이브러리입니다. ThrottledStream도 사용하고 있습니다.

 internal bool UploadUsingHighLevelAPI(String FilePath, ChunkDetails ObjMetaData, 
              S3Operations.UploadType uploadType, 
     Stream inputStream) 
     { 
     String METHOD_NAME = "UploadUsingHighLevelAPI"; 
     String keyName; 
     String existingBucketName; 
     TransferUtilityUploadRequest fileTransferUtilityRequest = null; 
     int RetryTimes = 3; 
     ThrottledStream throttleStreamObj = null; 

     long bps = ThrottledStream.Infinite; 
     try 
     { 


      keyName = ObjMetaData.KeyName; 
      existingBucketName = ObjMetaData.BucketName; 

      TransferUtility fileTransferUtility = new 
        TransferUtility(ObjMetaData.AccessKeyID,  ObjMetaData.SecretAccessKey); 

      FileInfo fin = new FileInfo(FilePath); 

      //streamObj = new FileStream(FilePath, FileMode.Open); 

      bps = (long)(1024 * ObjMetaData.MaxAvailSpeed * ((double)ObjMetaData.Bandwidth/100.0)); 


      throttleStreamObj = new ThrottledStream(ObjMetaData.FileStream, bps); 


      System.Collections.Specialized.NameValueCollection metaInfo = new System.Collections.Specialized.NameValueCollection(); 
      if (ObjMetaData.MetaInfo != null) 
      { 
       foreach (DictionaryEntry kvp in ObjMetaData.MetaInfo) 
       { 
        metaInfo.Add(kvp.Key.ToString(), kvp.Value.ToString()); 
       } 
      } 


      long OffDiff = ObjMetaData.EndOffset - ObjMetaData.StartOffset; 
      long partSize; 
      if (fin.Length >= OffDiff) 
      { 
       partSize = OffDiff; 
      } 
      else 
       partSize = fin.Length; 



      if (uploadType == UploadType.File) 
      { 
       //fileTransferUtility.Upload(FilePath, existingBucketName, keyName); 


       fileTransferUtilityRequest = 
       new TransferUtilityUploadRequest() 
       .WithBucketName(existingBucketName) 
       //.WithFilePath(FilePath) 
       .WithStorageClass(S3StorageClass.ReducedRedundancy) 
       .WithMetadata(metaInfo) 
       .WithPartSize(partSize) 
       .WithKey(keyName) 
       .WithCannedACL(S3CannedACL.PublicRead) 
       .WithTimeout(Int32.MaxValue - 1) 
       .WithInputStream(throttleStreamObj) as TransferUtilityUploadRequest; 

      } 
      else if (uploadType == UploadType.Stream) 
      { 
       fileTransferUtilityRequest = 
       new TransferUtilityUploadRequest() 
       .WithBucketName(existingBucketName) 
       .WithStorageClass(S3StorageClass.ReducedRedundancy) 
       .WithMetadata(metaInfo) 
       .WithPartSize(partSize) 
       .WithKey(keyName) 
       .WithCannedACL(S3CannedACL.PublicRead) 
       .WithTimeout(Int32.MaxValue - 1) 
       .WithInputStream(throttleStreamObj) as TransferUtilityUploadRequest 
       ; 
      } 



      for (int index = 1; index <= RetryTimes; index++) 
      { 
       try 
       { 

        // Upload part and add response to our list. 
        fileTransferUtility.Upload(fileTransferUtilityRequest); 
        Console.WriteLine(" ====== Upload Done ========="); 
        if (eventChunkUploaded != null) 
         eventChunkUploaded(ObjMetaData); 
        break; 

       } 
       catch (Exception ex) 
       { 
        if (index == RetryTimes) 
        { 
         m_objLogFile.LogError(CLASS_NAME, METHOD_NAME + " - Attempt " + 
          index + Environment.NewLine + FilePath, ex); 

         if (eventChunkUploadError != null) 
          eventChunkUploadError(ObjMetaData, ex.Message); 

        } 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      m_objLogFile.LogError(CLASS_NAME, METHOD_NAME, ex); 
      return false; 
     } 
     finally 
     { 

      if (throttleStreamObj != null) 
      { 
       //inputStream1.Close(); 
       throttleStreamObj = null; 
      } 
     } 

     return true; 
    } 

문제가 있으면 알려주세요.

0

내가 코드에서 경쟁 조건이있다 생각합니다. 나는 같은 기능을하려고 노력하고있다. 코드를 공유해 드리겠습니다. 게시 한 코드를 수정 한 경우 링크가 잘되어 있습니다. 최고 감사합니다, 브루스

+0

안녕하세요, Bruce, 답변에 게시 된 답글을 참조하십시오. –