Временные файлы не удаляются в 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); 

Я пробовал ссылаться property.getBinary.dispose(), который указывает на AbstractQValue dispose()и узнайте, что это пустой метод.

Я погуглил и наткнулся на JCR-3568, и это до сих пор не решено. Мое приложение работает в течение длительного времени, и его невозможно отключить часто.

Похоже, мне чего-то не хватает, так как это может быть очень распространенной проблемой.

1 ответ

В библиотеке 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 вместо Binary:

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

Класс JcrHelper использует устаревший метод и нарушает инкапсуляцию, но код не имеет утечек. Я думаю, что это единственный возможный обходной путь, пока утечка в двоичной реализации не устранена. Кроме того, этот код создает только 1 копию вашего файла во временной папке (будет удален в GC)

Другие вопросы по тегам