2016-11-23 24 views
0

ビューをループして各文書から添付ファイルを取得するJavaエージェントがあります。添付ファイルは文書xmlデータを含む.dxlファイルです。私は、いくつかの一時ディレクトリでファイルを抽出し、抽出されるとすぐに、抽出された.dxlをインポートしようとしています。ループ内のDxlImporterエラー "DXLインポータ操作が失敗しました"

しかし、ここで問題は、それが唯一の輸入は、あるか、ループの最初の文書の添付ファイル上で動作し、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) 

私のJavaエージェント・コードが

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

ですコードは "Break Point"を出力してエラーをスローしますが、最初に添付ファイルをインポートするまで実行します。

その他のケースでは、ファイルシステムからの特定のdxlファイルdxlをエラーなしでデータベースの文書としてインポートします

渡されたストリームの問題であるかどうかわかりませんが、完了しておらず、次のループが実行されます。

どのような提案も参考になります。

+0

短い答え:個々の操作を独自の方法で移動してループを制限するメソッドを呼び出す、リサイクルして次の文書に進むリサイクル!!!! – stwissel

答えて

1

whileループが最初の文書から移動する部分は表示されません。次のドキュメントにそれを進めるために、ループの終わり近く

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

通常、あなたのようなものを持っているでしょう。あなたのコードが現在立っているように、それは進歩しないと思われ、常に最初の文書に載っています。

ドミノのオブジェクトをリサイクルする必要があるかどうかわからない場合は、その必要性を説明するブログ記事を検索することをお勧めします。 少し複雑ですが、基本的にJavaオブジェクトはC APIのオブジェクトの単なるラッパーに過ぎません。 ドミノオブジェクト(ドキュメント、ビュー、DocumentCollectionなど)を作成するたびに、メモリハンドルが基になる「C」レイヤーに割り当てられます。これはリリース(またはリサイクル)する必要があり、セッションがリサイクルされると最終的に実行されますが、ループで処理しているときは、使用可能なメモリハンドルを使い果たしてクラッシュする可能性があるため、

はまた、それはあなたが終了し、各ファイル

最後に、例外の原因となっている抽出されたファイルは、有効なDXLファイルが間違いであることをダブルチェック、それをインポートした後、各ストリームを閉じる(リサイクル)する必要があるかもしれませんが可能です単に添付ファイルの一部が有効なDXLでなく、常に例外をスローすることになります。 ループ内にtry/catchを配置して、そのシナリオを処理し(問題ファイルを報告する)、エージェントを停止せずに続けることができます

+0

こんにちは、お返事はありがとうございましたが、私はそれが私からの間違いをタイプしているのがわかりました。しかし、私はdxlDoc.recycle()を実行していません。 –

+0

私はこのソリューションをやってみたが、exeptionが "importer.importDxl(stream、db); " –

+1

の場合、抽出されたファイルが有効なdxlであることを確かめていますか?それはまだ最初に動作し、2回目に失敗しますか?各輸入後にストリームを閉鎖していますか?ループ内にtry catchを置くのはどうでしょうか?それで、ある文書で失敗した場合でも、次の文書に移動します。 dxlが常に最初の埋め込みオブジェクトであることを100%確信していますか?代わりにベクトルをループするのはなぜですか?また、サイドノートとして、埋め込まれたオブジェクトをリサイクルする必要があります。そうしないと、秘密に作成された一時ファイルはクリーンアップされません。 –

関連する問題