2

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

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);
}

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

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

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

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

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();
}
4

1 回答 1

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();

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

于 2012-07-25T15:22:00.103 回答