0

在我从 5 个文档中提取任意两个文档后,DotCMIS 调用停止响应。

我检查了 Alfresco 服务器上的日志,并没有与失败的调用相关的任何内容。

我已经调试以确定超时。

// 定义 alfresco 参数下已经存在的 CMIS 可用路径[DotCMIS.SessionParameter.AtomPubUrl] = " https://localhost:8080/alfresco/service/cmis ";

// alfresco 门户管理员用户名参数[DotCMIS.SessionParameter.User] = "admin";

// 露天门户管理员密码参数[DotCMIS.SessionParameter.Password] = "w4rth0g!";

// 定义会话工厂 SessionFactory factory = SessionFactory.NewInstance();

// 使用会话工厂获取默认存储库,在此存储库上我们将执行操作并在此存储库上创建会话 ISession session = factory.GetRepositories(parameters)[0].CreateSession();

公共 ContentStream GetContentByDocumentId(string docId) { ISession session; IObjectId 标识;IDocument 文档;IContentStream 内容流;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;
    }

在这里,我正在关闭内容流。稍后在下面的方法中,我试图循环遍历

public static void CreateMergedPdf(string targetPdfLocation, IEnumerable docStreams) { try { using (FileStream stream = new FileStream(targetPdfLocation, FileMode.Create)) { var pdfDoc = new Document(PageSize.A4); PdfCopy pdf = 新 PdfCopy(pdfDoc, 流); pdfDoc.Open();

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

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

我已将关闭连接移至我在这里使用的方法。

// 按照 orderNo 字段的顺序合并文档。var docStreams = new 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() 时,它会给出超时错误。

4

1 回答 1

1

您是否已消费并关闭了文档内容流?.Net 每台服务器只允许两个并发连接。如果您不关闭流,则拖曳连接会用完,.Net 会阻塞,直到它们关闭。

另见:https ://issues.apache.org/jira/browse/CMIS-559

于 2016-09-08T08:27:10.970 回答