2016-09-07 2 views
0

Les appels DotCMIS cessent de répondre après avoir extrait deux documents sur 5.Problèmes d'expiration de délai étranges avec Alfresco

J'ai vérifié les journaux sur le serveur Alfresco et rien à voir avec les appels en échec.

J'ai débogué pour identifier le délai d'expiration. // définir le chemin CMIS disponible qui est déjà disponible sous alfresco paramètres [DotCMIS.SessionParameter.AtomPubUrl] = "https://localhost:8080/alfresco/service/cmis";

// alfresco portal admin nom d'utilisateur paramètres [DotCMIS.SessionParameter.User] = "admin";

// alfresco portal admin mot de passe paramètres [DotCMIS.SessionParameter.Password] = "w4rth0g!"; // définition de la fabrique de sessions Usine de SessionFactory = SessionFactory.NewInstance();

// en utilisant obtenir le référentiel par défaut usine de session, sur ce dépôt que nous effectuerons des actions & Créer une session sur ce référentiel ISession session = factory.GetRepositories (paramètres) [0] .CreateSession();

public ContentStream GetContentByDocumentId (string docId) { Séance ISession; IObjectId id; IDocument doc; IContentStream contentStream; ContentStream contentStreamModel = new 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; 
    } 

Ici, je ferme le flux de contention. Plus tard dans la méthode ci-dessous, je suis en train de boucle à travers cette

CreateMergedPdf public static void (string targetPdfLocation, IEnumerable docStreams) { essayer { en utilisant (flux FileStream = new FileStream (targetPdfLocation, FileMode.Create)) { var pdfDoc = nouveau document (PageSize.A4); PdfCopy pdf = nouvelle PdfCopy (pdfDoc, stream); pdfDoc.Open(); Je ai déplacé la connexion de fermeture à la méthode où je consomme ici.

// Fusionner les documents dans l'ordre de la commande Champ No. var docStreams = new Liste(); // var docStreams2 = new 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; 

Ici, je ne peux pas accéder au flux fermé.Il existe un moyen de rouvrir?

Lors de la troisième fois que le createsession() est appelé, il donne un délai d'erreur.

+0

Il suffit d'ouvrir une session et le réutiliser. L'ouverture d'une session pour chaque document n'est pas nécessaire. –

Répondre

1

Avez-vous consommé et fermé les flux de contenu de document? .Net autorise seulement deux connexions simultanées par serveur. Si vous ne fermez pas les flux, les connexions de remorquage sont épuisées et les blocs .Net jusqu'à ce qu'ils soient fermés.

Voir aussi: https://issues.apache.org/jira/browse/CMIS-559

+0

Oui, j'ai essayé en fermant le flux de contenet. Le délai d'attente de la session se produira maintenant si je ferme. Je passe le doc ajouté à une autre méthode et lit le flux de contenet. Ici, je reçois errot connot accès flux fermé. – coder

+0

Y a-t-il moyen de rouvrir? J'ai mis à jour ma question avec le code utilisé. Ici, sur \t \t \t \t \t foreach (var doc dans docStreams) \t \t \t \t \t { \t \t \t \t \t \t pdf.AddDocument (nouveau PdfReader (doc)); \t \t \t \t \t \t} Je vais obtenir une erreur dans ce bolck "Impossible d'accéder à un flux fermé." – coder

+0

Vous devez consommer le flux. Juste la fermeture ne suffit pas. Ouvrez le flux lorsque vous en avez besoin, pas avant. Vous pouvez obtenir toutes les métadonnées de flux (nom, longueur, taille) à travers les propriétés du document. Ou ... augmentez DefaultConnectionLimit. –