我正在使用以下代码段来保存内容:
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();
}
答案 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();
由于某些内容编码问题,以前的保存已经到位,因此测试显示是否有效。