【问题标题】:Temporary files are not getting deleted in Apache JackrabbitApache Jackrabbit 中的临时文件不会被删除
【发布时间】:2016-12-22 07:32:43
【问题描述】:

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

下面是sn-p的代码:

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

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

我用谷歌搜索并遇到了JCR-3568,这仍然没有解决。我的应用程序运行时间很长,不能经常关闭。

看起来我遗漏了一些东西,因为这可能是一个非常常见的问题。

【问题讨论】:

  • 嗨,我也面临同样的问题。设备上没有剩余空间。谁能建议 JCR-3568 将在哪个版本中得到解决。
  • 写一个单元测试。修复错误。提出补丁。它是开源的。

标签: java apache jcr jackrabbit


【解决方案1】:

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 而不是 Binary:

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

JcrHelper 类使用了不推荐使用的方法,并且违反了封装,但代码没有泄漏。我认为这是唯一可能的解决方法,而二进制实现中的泄漏未修复。 此外,此代码仅在临时文件夹中创建文件的 1 个副本(将在 GC 上删除)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-01
    • 2015-07-17
    • 2012-04-11
    • 1970-01-01
    • 2014-04-06
    • 2018-11-04
    • 2015-03-20
    • 2021-10-30
    相关资源
    最近更新 更多