2016-12-22 1 views
1

J'utilise Apache Jackrabbit pour stocker des fichiers PDF, doc et utiliser FileDataStore comme magasin de données sous-jacent. Après avoir défini les valeurs de données binaires, de nombreux fichiers temporaires/spool (bin * .tmp) sont créés dans le répertoire temp. Ces fichiers ne sont jamais supprimés tant que JVM n'est pas arrêté. Ces fichiers temporaires inondent le répertoire tmp et entraînent une erreur no space left on device.Les fichiers temporaires ne sont pas supprimés dans Apache Jackrabbit

Ce qui suit est l'extrait de code:

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

J'ai essayé d'invoquer property.getBinary.dispose(), qui pointe vers AbstractQValue dispose(), et savoir qu'il est une méthode vide.

J'ai googlé et rencontré JCR-3568 et cela n'est toujours pas résolu. Mon application dure longtemps et ne peut pas être arrêtée fréquemment.

On dirait qu'il me manque quelque chose car cela pourrait être un problème très commun.

+1

Salut, je suis également confronté au même problème. Pas d'espace disponible sur le périphérique. Quelqu'un peut-il suggérer dans quelle version sera JCR-3568 être adressée. –

+0

Écrire un test unitaire. Corrige le bug. Proposez un patch. C'est open source. –

Répondre

0

Il y a une fuite de ressources dans la librairie jackrabbit-spi-commons, et elle n'est toujours pas corrigée. Lorsque vous écrire le fichier sur le serveur et la taille de fichier plus de 64 Ko, bibliothèque client crée 2 copie du fichier original dans le dossier temporaire, mais supprime uniquement 1. Bien qu'il ne fixe, vous pouvez utiliser cette solution:

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

et vous devez utiliser le code valeur binaire à la place:

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

classe JcrHelper utilise la méthode désapprouvée, et constitue une violation encapsulation, mais le code ne qui fuit. Je pense que sa seule solution de contournement possible lors d'une fuite dans l'implémentation binaire n'est pas corrigée. En outre, ce code crée seulement 1 copie de votre fichier dans le dossier temporaire (sera supprimé sur le GC)