我正在使用以下代码段来保存内容:
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();
}