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

このように書いたコンテンツを他の場所で(サーバーの負荷に応じて)短時間で読むと、古いコンテンツが返されます。インデックス作成が進行中のようですが、最終コミットの前に古いコンテンツが返される可能性はありますか?もしそうなら、この動作をオーバーライドして、可能な限り最新のコンテンツにアクセスすることは可能ですか?contentUrl経由?

この動作を回避するために、読み取り要求ごとにスレッドを使用しています。このスレッドは最初はしばらくスリープしますが、この「解決策」は本当に嫌いです。

編集:Linux(CentOSおよびUbuntu)上のTomcat6.0.35で実行されている最新のSVNソースからビルドしました。システム負荷-数秒ごとに何百ものファイルが変更されることを意味します。

編集:読書は次のようになります:

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 に答える