2012-10-18 41 views
2

自Notes/Domino版本7以來,我使用了Bob Balaban的「雙頭猛獸」(http://bobzblog.com/tuxedoguy.nsf/dx/the- 2-headed-beast-debugging-domino-java-agents-with-eclipse)用於在Eclipse中編寫可調試的Java代理!這就像一個魅力 - 唯一的問題是我不得不將代碼從Eclipse複製/粘貼到標準Notes代理。如何調試Java代理(兩頭猛獸方法)

在Domino Designer的當前Eclipse版本(8.5.3 FP2)中,我嘗試瞭解是否可以使用相同的設置在Domino Designer中直接調試代理(如Java程序)。看起來我可以讓代碼運行,但是,我無法在任何斷點處停下來。我得到的消息是:

由於缺少行號屬性,無法在dk.domain.AgentTemplate中安裝斷點。修改編譯器選項以生成行號屬性。

我試圖將調試配置設置爲「停在主」。它似乎停止了。但是,如果我繼續,它會運行所有的代碼 - 我看不到代碼中的位置,當然,我看不到變量或它們的值。

已將Preferences - Java - Compiler中的選項選擇爲「將行號屬性添加到生成的類文件」。我還沒有找到其他編譯器選項來生成行號。

我在Designer中使用Java 1.5合規性。

有沒有人能夠設置?

/約翰

+0

我不知道很多關於Notes/Domino Designer中,但你可能想發表一些錯誤,以幫助人們。 –

+0

@ Disco3 - 同意,剛剛厭倦了它,並把它扔回角落;-)然而,做一個適當的測試其實也最終找到了解決方案。所以,謝謝你的「擡起頭來」;-) –

+0

這麼說 - 我常常找到我的問題的答案,但開始向其他人解釋。 –

回答

5

那麼,有時你只需要解釋你的問題找到解決方案。

爲了徹底描述問題,我最終嘗試使用JDK 1.6編譯器合規性級別(在首選項 - Java編譯器下)。而這實際上工作!

所以建立一個代理,像這樣的結構,你可以直接在Domino Designer調試Java代理:

package dk.dalsgaarddata; 

import lotus.domino.AgentBase; 
import lotus.domino.AgentContext; 
import lotus.domino.Database; 
import lotus.domino.DocumentCollection; 
import lotus.domino.NotesException; 
import lotus.domino.NotesFactory; 
import lotus.domino.NotesThread; 
import lotus.domino.Session; 
import dk.dalsgaarddata.debug.DebugAgentContext; 

/* ------------------------------------------------------------------------------------ 
    Created: 2009.04.21/Jda 
    Revised: 2009.04.29/Jda - v.1.1 

    Agent template.... 
    ------------------------------------------------------------------------------------ */ 

public class AgentTemplate extends AgentBase { 
    // DEBUG: For Eclipse debugging - see main method at the end of this class. 

    // Beginning of "ordinary" Lotus Notes/Domino Agent.... 
    private Session mySession = null; 
    private AgentContext myContext = null; 
    private DD_BackendLog myLog = null; 

    private void cleanUp() { 
     try { 
      if (null != myLog) 
       myLog.end(); 
      if (null != mySession) 
       mySession.recycle(); 
     } catch (NotesException ne) { 
      System.err.println("Error cleaning up log and Session."); 
     } 
    } 

    // Lotus Notes/Domino entry point... 
    public void NotesMain() { 
     try { 
      if (mySession == null) { 
       mySession = getSession(); 
       myContext = mySession.getAgentContext(); 
      } 
      SessionContext.getInstance(mySession, myContext); 
      myLog = SessionContext.getLog(); 

      System.out.println("NotesMain Started...."); 
      // Your code goes here.... 

      myLog.information(".... completed!"); 
     } catch (NotesException ne) { 
      myLog.error("Agent ERROR: NotesException = " + ne.text); 
      myLog.writeStackTrace(ne); 
     } catch (Exception e) { 
      myLog.error("Agent ERROR: Exception = " + e.getMessage()); 
      myLog.writeStackTrace(e); 
     } finally { 
      cleanUp(); 
     } 
    } 

    /* Instructions for debugging!! 
    // TODO - adjust run configuration 
     You need to add VM arguments, e.g.: 

      -Dsun.boot.library.path="c:\\Lotus\\Notes;c:\\Lotus\\Notes\\jvm\\bin" 

    ... and you need to add a PATH environment variable, e.g.: 

      PATH c:\Lotus\Notes 
    */ 

    // Remember to rename these constructors when duplicating this code to a new agent!!! 
    // ... if not handled by Eclipse when pasting a copy ;-) 
    public AgentTemplate() { 
    } 

    public AgentTemplate(Session s, AgentContext c) { 
     this.mySession = s; 
     this.myContext = c; 
    } 

    // Entry point for Java program (when running from Eclipse) 
    public static void main(String[] args) { 
     // By example from Bob Balaban "The two-headed beast". See more at: 
     // http://www.bobzblog.com/tuxedoguy.nsf/dx/DominoAgents-Eclipse_v2.pdf/$file/DominoAgents-Eclipse_v2.pdf 
     System.out.println("main Starting...."); 
     Session s = null; 
     Database d = null; 
     DocumentCollection dc = null; 
     AgentContext ctx = null; 

     System.out.println("NotesThread.sinitThread()...."); 
     NotesThread.sinitThread(); 
     try { 
      System.out.println("createSession...."); 
      s = NotesFactory.createSession(); 
      System.out.println("set database...."); 
      d = s.getDatabase(DebugAgentContext.ECLIPSE_SERVER, DebugAgentContext.ECLIPSE_DATABASE); 
      System.out.println("Database: " + d.getFileName() + " on " + d.getServer()); 
      System.out.println("set debug context...."); 
      ctx = new DebugAgentContext(s, d, dc); 
      // Create the agent object, invoke it on NotesMain(), the way Domino does 
      System.out.println("create agent object...."); 
      AgentTemplate agent = new AgentTemplate(s, ctx); 
      System.out.println("call agent...."); 
      agent.NotesMain(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       if (s != null) 
        s.recycle(); 
      } catch (Exception x) { 
      } 
      NotesThread.stermThread(); 
     } 
    } // end main - and Eclipse entry point 

} 

我已經離開我的「打印」在更容易測試的代碼指令。很明顯,你會從你的真實模板中刪除它們。

另一件可能促成這項工作的原因是,我改變了配置參數的大小寫以匹配與磁盤上的目錄完全相同的大小寫。

/約翰