临时文件未在Apache JackRabbit中删除



我正在使用Apache Jackrabbit存储PDF,DOC文件并使用FileDataStore作为基础数据存储。设置二进制数据值之后,在临时目录中创建了许多临时/启动文件(bin*.tmp)。在JVM关闭之前,这些文件永远不会被删除。这些临时文件淹没了TMP目录并导致no space left on device错误。

以下是代码段:

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

我尝试调用指向AbstractQValue dispose()property.getBinary.dispose(),并发现它是一个空的方法。

我已经搜索过搜索并遇到了JCR-3568,但仍未解决。我的应用程序运行持续时间很长,无法经常关闭。

看起来我缺少一些事情,因为这可能是一个非常普遍的问题。

jackrabbit-spi-commons库中存在资源泄漏,但仍未修复。当您将文件写入服务器和文件大小超过64kb时,客户端库将在临时文件夹中创建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类使用弃用的方法,违反了封装,但代码不泄漏。我认为,在二进制实施中泄漏时,它唯一可能的解决方法。此外,此代码仅在temp文件夹中创建文件的1副本(将在GC上删除)

最新更新