2016-11-23 2 views
0

J'ai un agent java qui boucle dans la vue et obtient la pièce jointe de chaque document. La pièce jointe n'est rien d'autre que le fichier .dxl contenant les données XML du document. J'extrais le fichier dans un répertoire temporaire et essaye d'importer le fichier .dxl extrait dès qu'il est extrait.DxlImporter dans une boucle provoque une erreur "DXL importeur failed"

Mais le problème est ici, il ne importe ou travaille sur l'attachement du premier document dans la boucle et jette l'erreur dans la console de débogage java

NotesException: DXL importer operation failed 
at lotus.domino.local.DxlImporter.importDxl(Unknown Source) 
at JavaAgent.NotesMain(Unknown Source) 
at lotus.domino.AgentBase.runNotes(Unknown Source) 
at lotus.domino.NotesThread.run(Unknown Source) 

Mon code d'agent java est

public class JavaAgent extends AgentBase { 
static DxlImporter importer = null; 

public void NotesMain() { 

    try { 
     Session session = getSession(); 
     AgentContext agentContext = session.getAgentContext(); 



     // (Your code goes here) 
     // Get current database 
     Database db = agentContext.getCurrentDatabase(); 

     View v = db.getView("DXLProcessing_mails"); 
     DocumentCollection dxl_tranfered_mail = v.getAllDocumentsByKey("dxl_tranfered_mail"); 
     Document dxlDoc = dxl_tranfered_mail.getFirstDocument(); 
     while(dxlDoc!=null){ 

      RichTextItem rt = (RichTextItem) dxlDoc.getFirstItem("body"); 

      Vector allObjects= rt.getEmbeddedObjects(); 

      System.out.println("File name is "+ allObjects.get(0)); 
      EmbeddedObject eo = dxlDoc.getAttachment(allObjects.get(0).toString()); 
      if(eo.getFileSize()>0){ 
     eo.extractFile(System.getProperty("java.io.tmpdir") + eo.getName()); 

      System.out.println("Extracted File to "+System.getProperty("java.io.tmpdir") + eo.getName()); 
      String filePath = System.getProperty("java.io.tmpdir") + eo.getName(); 
      Stream stream = session.createStream(); 
      if (stream.open(filePath) & (stream.getBytes() >0)) { 
      System.out.println("In If"+System.getProperty("java.io.tmpdir")); 

      importer = session.createDxlImporter(); 
      importer.setDocumentImportOption(DxlImporter.DXLIMPORTOPTION_CREATE); 
        System.out.println("Break Point"); 

     importer.importDxl(stream,db); 
     System.out.println("Imported Sucessfully"); 
     }else{ 
      System.out.println("In else"+stream.getBytes()); 


     } 

     } 
      dxlDoc = dxl_tranfered_mail.getNextDocument(); 

    } 
    } catch(Exception e) { 
     e.printStackTrace(); 
    } 

Le le code s'exécute jusqu'à ce qu'il imprime "Break Point" et lève l'erreur mais la pièce jointe est importée pour la première fois

Dans les autres cas, si je code dur le chemin de fichier pour le fichier dxl spécifique à partir du système de fichiers, il importe le dxl comme document dans la base de données sans erreurs

Je me demande si c'est le problème du flux transmis ne se termine pas et la boucle suivante s'exécute.

Toutes sortes de suggestions seront utiles.

+0

Réponse courte: déplacer l'opération individuelle dans sa propre méthode et limiter la boucle appeler la méthode, recycler et passer au document suivant. Et recycler !!!! – stwissel

Répondre

1

Je ne vois aucune partie où votre boucle while passerait à partir du premier document.

Habituellement, vous auriez quelque chose comme:

Document nextDoc = dxl_tranfered_mail.getNextDocument(dxlDoc); 
dxlDoc.recycle(); 
dxlDoc = nextDoc; 

Vers la fin de la boucle pour faire avancer au document suivant. En l'état actuel de votre code, il semblerait que cela ne progresse jamais, et soyez toujours sur le premier document.

Si vous n'êtes pas au courant de la nécessité de «recycler» les objets domino, je vous suggère de rechercher des articles de blogue expliquant la nécessité de le faire. C'est un peu compliqué mais fondamentalement, les objets Java ne sont qu'un 'wrapper' pour les objets de l'API C. Chaque fois que vous créez un objet Domino (tel qu'un document, View, DocumentCollection, etc.), un handle de mémoire est alloué dans le calque 'C' sous-jacent. Cela doit être libéré (ou recyclé) et il finira par le faire quand la session est recyclée, mais quand vous traitez en boucle, il est beaucoup plus important de recycler car vous pouvez facilement épuiser les poignées de mémoire disponibles et provoquer un plantage.

Il est également possible que vous devrez peut-être fermer (et recycler) chaque flux après avoir un fini d'importer chaque fichier

Enfin, vérifiez que le fichier extrait qui est à l'origine une exception est sans aucun doute un fichier DXL valide, pourrait simplement être que certaines des pièces jointes ne sont pas valables DXL et jetteront toujours une exception. vous pourriez mettre un try/catch dans la boucle pour gérer ce scénario (et signaler les fichiers problèmes), ce qui permettra à l'agent de continuer sans arrêter

+0

Salut merci pour la réponse, mais comme je peux le voir il était erreur de frappe de moi. Mais je ne suis pas en train d'effectuer dxlDoc.recycle(); –

+0

J'ai essayé de faire cette solution, mais l'exeption jette à "importer.importDxl (flux, db); " –

+1

quelques choses, êtes-vous absolument sûr que le fichier extrait est valide dxl? Est-ce que ça marche toujours la première fois et échoue la deuxième fois?est-ce que fermer le flux après chaque importation fait une différence? que diriez-vous de mettre un essai essayer à l'intérieur de la boucle, donc si elle échoue sur un document, il passera toujours à l'autre. Êtes-vous sûr à 100% que le dxl est toujours le premier objet incorporé? pourquoi ne pas passer à travers le vecteur à la place? De plus, vous devriez certainement recycler les objets incorporés lorsque vous en avez fini avec eux, sinon ils ne nettoieront pas les fichiers temporaires qu'ils ont secrètement créés. –