2016-09-07 19 views
0

DotCMIS 호출은 5 개의 문서 중에서 2 개의 문서를 가져온 후에 응답을 중지합니다.Alfresco에서 이상한 시간 초과 문제가 발생했습니다.

Alfresco 서버에서 로그를 검사했는데 실패한 호출과 관련된 내용이 전혀 없습니다.

타임 아웃을 식별하기 위해 디버깅했습니다.

// alfresco에서 이미 사용 가능한 CMIS 사용 가능한 경로를 정의하십시오. 매개 변수 [DotCMIS.SessionParameter.AtomPubUrl] = "https://localhost:8080/alfresco/service/cmis";

// alfresco 포털 관리자 사용자 이름 [DotCMIS.SessionParameter.User] = "admin";

// alfresco 포털 관리자 암호 매개 변수 [DotCMIS.SessionParameter.Password] = "w4rth0g!";

// 세션 팩토리를 정의하십시오. SessionFactory factory = SessionFactory.NewInstance();

//이 저장소에 우리가 행동 &이 저장소에 ISession 세션 = factory.GetRepositories (매개 변수) 세션을 생성 수행하는 것, 세션 공장 기본 저장소를 얻을 사용 [0] .CreateSession();

공개 콘텐츠 스트림 GetContentByDocumentId (문자열 docId) { 세션 세션; IObjectId id; IDocument doc; IContentStream contentStream; ContentStream contentStreamModel = 새 ContentStream();

 try 
     { 
      session = GetSession(); 
      id = session.CreateObjectId(docId); 
      doc = session.GetObject(id) as IDocument; 

      // Content 
      contentStream = doc.GetContentStream(); 

      contentStreamModel.FileName = contentStream.FileName; 
      contentStreamModel.Length = contentStream.Length; 
      contentStreamModel.MimeType = contentStream.MimeType; 
      contentStreamModel.Stream = contentStream.Stream; 

      contentStreamModel.Stream.Close(); 
     } 
     catch (Exception ex) 
     { 
      throw new ApplicationException(ex.Message); 
     } 
     finally 
     { 

      session = null; 
      id = null; 
      // session.Delete(id, true); 
      // session.Clear(); 
      doc = null; 
      contentStream = null; 
      //contentStream.Stream.Close(); 
      //contentStreamModel.Stream.Close(); 

     } 

     return contentStreamModel; 
    } 

여기에서는 contenet 스트림을 닫습니다. 나중에 내가 그

공공 정적 무효 CreateMergedPdf을 통해 루프를 시도하고 아래의 방법 (문자열 targetPdfLocation, IEnumerable을 docStreams) 는 { 사용 { 시도 (파일 스트림 스트림 = 새로운하여 FileStream (targetPdfLocation, FileMode.Create)) 에서 { var pdfDoc = 새 문서 (PageSize.A4); PdfCopy pdf = 새로운 PdfCopy (pdfDoc, stream); pdfDoc.Open();

   foreach (var doc in docStreams) 
       { 
        pdf.AddDocument(new PdfReader(doc)); 
       } 

       pdfDoc.Close(); 
      } 
     } 
     catch (Exception ex) 
     { 
      throw new ApplicationException(ex.Message); 
     } 
    } 

여기서 폐색 연결을 여기에서 소비하는 방법으로 이동했습니다.

// 주문순으로 문서를 병합하지 마십시오. var docStreams = 새 List(); // var docStreams2 = new List();

 **foreach (string docId in orderedDocIds) 
     { 
      // Retreive doc from Alfresco. 
      var doc = GetContentByDocumentId(docId); 
      docStreams.Add(doc.Stream); 
      doc.Stream.Close(); 
     }** 

     // docStreams.CopyTo(docStreams2.ToArray()); 



     // Created a merged pdf and drops in a temp folder. 
     FileHelper.CreateMergedPdf(mergedPdfFileLocation, docStreams2); 

     return mergedPdfFileLocation; 

폐쇄 스트림에 액세스 할 수 없습니다. 다시 열 수있는 방법이 있습니까?

세 번째로 createsession()이 호출되면 timeout errror가 발생합니다.

+0

하나의 세션을 열고 다시 사용하기 만하면됩니다. 각 문서에 대한 세션을 열 필요는 없습니다. –

답변

1

문서 콘텐츠 스트림을 사용하고 닫았습니까? .Net은 서버 당 두 개의 동시 연결 만 허용합니다. 시냇물을 닫지 않으면 견인 연결은 위로, .Net 차단은 닫힐 때까지 사용됩니다.

다음을 참조하십시오. https://issues.apache.org/jira/browse/CMIS-559

+0

예, contenet 스트림을 닫으려고했습니다. 내가 닫으면 세션 시간 초과가 발생합니다. 추가 된 문서를 다른 메서드로 전달하고 contenet 스트림을 읽습니다. 여기 errro connot 액세스가 닫힌 스트림을 얻습니다. – coder

+0

다시 여는 방법이 있습니까? 사용 된 코드로 내 질문을 업데이트했습니다. 여기 \t \t \t \t \t의 foreach (docStreams의 VAR의 문서)에 \t \t \t \t \t \t { \t \t \t \t \t pdf.AddDocument (새 PdfReader (의사)); \t \t \t \t \t} "이 폐쇄 형 스트림에 액세스 할 수 없습니다."라는 오류 메시지가 나타납니다. – coder

+0

스트림을 소비해야합니다. 폐쇄만으로는 충분하지 않습니다. 전에 필요하지 않을 때 스트림을 엽니 다. 문서 속성을 통해 모든 스트림 메타 데이터 (이름, 길이, 크기)를 가져올 수 있습니다. 또는 ... DefaultConnectionLimit를 늘리십시오. –