2016-12-22 17 views
1

Apache Jackrabbitを使用して、PDF、docファイルを保存し、FileDataStoreを基本データストアとして使用しています。バイナリデータの値を設定すると、tempディレクトリに多くの一時/スプールファイル(bin * .tmp)が作成されます。 JVMがシャットダウンされるまで、これらのファイルは決して削除されません。これらの一時ファイルはtmpディレクトリに溢れており、結果としてno space left on deviceエラーになります。私はAbstractQValue dispose()を指すproperty.getBinary.dispose()を、起動しようとした、そしてそれは空のメソッドであることを見つけるしているApache Jackrabbitで一時ファイルが削除されない

Node childFileNode = childLeafFolder.addNode(file.pdf, NodeType.NT_FILE); 
Node childContentNode = childFileNode.addNode(Node.JCR_CONTENT, 
        NodeType.NT_RESOURCE); 
Property property = childContentNode.setProperty(Property.JCR_DATA, binary); 

:後

コードスニペットです。

私はグーグルでJCR-3568に出くわしましたが、これは未だ解決されていません。私のアプリケーションは長い間実行され、頻繁にシャットダウンすることはできません。

これは非常に一般的な問題である可能性があるため、私はいくつか不足しているように見えます。

+1

こんにちは、同じ問題に直面しています。デバイスにスペースが残っていません。誰でもどのバージョンでJCR-3568に対処するのかを提案できますか? –

+0

ユニットテストを書く。バグを修正してください。パッチを提案する。オープンソースです。 –

答えて

0

jackrabbit-spi-commonsライブラリにリソースリークがあり、まだ修正されていません。あなたは64キロバイト以上のサーバとファイルサイズにファイルを書き込むと、クライアントライブラリは一時フォルダに元のファイルの2のコピーを作成し、それが固定されていないものののみ1. を削除し、あなたは回避策を使用することができます。

public class JcrHelper { 
    public static Value createBinaryValue(Session jcrSession, InputStream in) throws UnsupportedRepositoryOperationException, RepositoryException { 
     ValueFactory valueFactory = jcrSession.getValueFactory(); 
     Value value = valueFactory.createValue(in); 
     return value; 
    } 
    public static void discardBinary(Value value) { 
     if (value instanceof QValueValue) { 
      QValueValue qValueValue = (QValueValue)value; 
      qValueValue.getQValue().discard(); 
     } 
    } 
} 

とでコードあなたの代わりにバイナリ値を使用する必要があります。

Value value = JcrHelper.createBinaryValue(jcrSession, inputStream); 
try { 
    contentNode.setProperty(Property.JCR_DATA, value); 
    jcrSession.save(); 
} finally { 
    JcrHelper.discardBinary(value); 
} 

JcrHelperクラスは非推奨メソッドを使用し、カプセル化に違反するが、コードリーキーではありません。私は、バイナリの実装でのリークが修正されていない唯一の可能な回避策だと思います。 さらに、このコードでは、一時フォルダにファイルのコピーが1つだけ作成されます(GCで削除されます)。

関連する問題