2016-09-07 5 views
0

DotCMIS-Aufrufe reagieren nicht mehr, nachdem ich zwei Dokumente aus 5 Dokumenten abgerufen habe.Strange Timeout-Probleme mit Alfresco

Ich habe die Protokolle auf dem Alfresco-Server überprüft und es gibt überhaupt nichts in Bezug auf die fehlgeschlagenen Anrufe.

Ich habe getestet, um das Timeout zu identifizieren.

// Definieren Sie den verfügbaren CMIS-Pfad, der bereits unter alfresco verfügbar ist Parameter [DotCMIS.SessionParameter.AtomPubUrl] = "https://localhost:8080/alfresco/service/cmis";

// alfresco Portal admin Benutzername Parameter [DotCMIS.SessionParameter.User] = "admin";

// Alfresco Portal Admin Passwort Parameter [DotCMIS.SessionParameter.Password] = "w4rth0g!";

// Sitzungs-Factory definieren SessionFactory factory = SessionFactory.NewInstance();

// Verwendung Sitzung Fabrik die Standard-Repository erhalten, auf diesem Repository würden wir & werden die Durchführung von Aktionen Sitzung auf diesem Repository session = factory.GetRepositories (Parameter) ISession erstellen [0] .CreateSession();

public ContentStream GetContentByDocumentId (Zeichenfolge docId) { ISession-Sitzung; IObjektID id; IDocument doc; IContentStream contentStream; ContentStream contentStreamModel = neuer 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; 
    } 

Hier schließe ich den contenet-Stream. Später in der folgenden Methode i Schleife versuche durch diese

public static void CreateMergedPdf (string targetPdfLocation, IEnumerable docStreams) { versuchen { mit (Filestream stream = neue Filestream (targetPdfLocation, FileMode.Create)) { var pdfDoc = neues Dokument (PageSize.A4); PdfCopy pdf = neue 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); 
     } 
    } 

Ich habe die schließende Verbindung zu einer Methode verlegt, wo ich hier konsumiere.

// Dokumente in der Reihenfolge der Bestellung zusammenfassenNein Feld. var docStreams = neue Liste(); // var docStreams2 = neue Liste();

 **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; 

Hier werde ich nicht geschlossen stream.Is Zugang bekommen kann es eine Möglichkeit, wieder zu öffnen?

Zum dritten Mal, wenn die creatsession() aufgerufen wird, gibt es Timeout Errror.

+0

Öffnen Sie einfach eine Sitzung und verwenden Sie sie erneut. Das Öffnen einer Sitzung für jedes Dokument ist nicht erforderlich. –

Antwort

1

Haben Sie die Inhaltsströme des Dokuments verbraucht und geschlossen? .Net erlaubt nur zwei gleichzeitige Verbindungen pro Server. Wenn Sie die Streams nicht schließen, werden die Kabelverbindungen aufgebraucht und .Net blockiert, bis sie geschlossen sind.

Siehe auch: https://issues.apache.org/jira/browse/CMIS-559

+0

Ja, ich habe es versucht, indem ich den Conteinet-Stream geschlossen habe. Das Session-Timeout wird jetzt passieren, wenn ich schließe. Ich gebe das hinzugefügte Dokument an eine andere Methode weiter und lese den Contenet-Stream. Hier bekomme ich keinen Zugriff auf den geschlossenen Stream. – coder

+0

Gibt es eine Möglichkeit, wieder zu öffnen? Ich habe meine Frage mit dem verwendeten Code aktualisiert. Hier am \t \t \t \t \t foreach (var doc in docStreams) \t \t \t \t \t { \t \t \t \t \t \t pdf.AddDocument (neu PdfReader (doc)); \t \t \t \t \t} Ich werde Fehler in diesem Bolck erhalten "Kann nicht auf einen geschlossenen Stream zugreifen." – coder

+0

Sie müssen den Stream konsumieren. Einfaches Schließen ist nicht genug. Öffnen Sie den Stream, wenn Sie es brauchen, nicht vorher. Sie können alle Stream-Metadaten (Name, Länge, Größe) über die Dokumenteigenschaften abrufen. Oder ... erhöhen Sie das DefaultConnectionLimit. –