内容服务会在一段时间内返回旧内容

时间:2012-07-24 16:38:08

标签: alfresco

我正在使用以下代码段来保存内容:

private void writeToFile(NodeRef nodeRef, String content) throws IOException {
    ContentWriter writer = contentService.getWriter(nodeRef, ContentModel.PROP_CONTENT, true);
    InputStream contentStream = new ByteArrayInputStream(content.getBytes(encoding));

    writer.setMimetype(mimeType);
    writer.setEncoding(encoding);
    writer.putContent(contentStream);

    Map<QName, Serializable> repoProps = nodeService.getProperties(nodeRef);

    ContentData contentData = (ContentData) repoProps.get(ContentModel.PROP_CONTENT);
    if(contentData == null)
        contentData = writer.getContentData();

    contentData = ContentData.setEncoding(contentData, encoding);
    contentData = ContentData.setMimetype(contentData, mimeType);
    repoProps.put(ContentModel.PROP_CONTENT, contentData);

    contentStream.close();

    nodeService.setProperties(nodeRef, repoProps);
}

当我在其他地方读取在短时间内(取决于服务器负载)这样写的内容时,返回旧内容。所以看起来索引可能正在进行中,所以在最终提交旧内容之前,这可能吗?如果是这样,是否可以覆盖此行为并访问最新的可能内容?通过contentUrl?

为了避免这种行为,我正在为每个读取请求使用线程,它在开始时会休眠一段时间,但我真的不喜欢这个“解决方案”。

编辑:我是从最新的SVN源构建的,在Linux上运行Tomcat 6.0.35(CentOS和Ubuntu);系统负载 - 我的意思是每隔几秒就会有数百个文件发生变化。

编辑:阅读看起来像这样:

private byte[] readFileContent(NodeRef nodeRef) throws IOException {
    ContentReader reader = contentService.getReader(nodeRef, ContentModel.PROP_CONTENT);

    if(reader == null)
        return null;

    InputStream originalInputStream = reader.getContentInputStream();
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

    final int BUF_SIZE = 1 << 8; // 1KiB buffer
    byte[] buffer = new byte[BUF_SIZE];
    int bytesRead = -1;

    while ((bytesRead = originalInputStream.read(buffer)) > -1) {
        outputStream.write(buffer, 0, bytesRead);
    }

    originalInputStream.close();

    return outputStream.toByteArray();
}

1 个答案:

答案 0 :(得分:0)

好的,通过简单的保存解决了这个问题:

ContentWriter writer = contentService.getWriter(nodeRef, ContentModel.PROP_CONTENT, true);
InputStream contentStream = new ByteArrayInputStream(content.getBytes(encoding));

writer.setMimetype(mimeType);
writer.setEncoding(encoding);
writer.putContent(contentStream);

contentStream.close();

由于某些内容编码问题,以前的保存已经到位,因此测试显示是否有效。