【问题标题】:How to debug Java agents (two headed beast approach)如何调试 Java 代理(两头野兽方法)
【发布时间】:2012-10-08 15:26:04
【问题描述】:

从 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 代理。

使用当前 Eclipse 版本 (8.5.3 FP2) 的 Domino Designer,我尝试查看是否可以使用相同的设置在 Domino Designer 中直接调试代理(作为 Java 程序)。似乎我可以让代码运行,但是,我不能让它在任何断点处停止。我得到的消息是:

由于缺少行号属性,无法在 dk.domain.AgentTemplate 中安装断点。修改编译器选项生成行号属性。

我已尝试将调试配置设置为“在主中停止”。它似乎停止了。但是,如果我跨步,它会运行所有代码 - 我看不到我在代码中的位置,当然我看不到变量或它们的值。

Preferences - Java - Compiler 中的“将行号属性添加到生成的类文件”中的选项已被选中。我还没有找到其他编译器选项来生成行号。

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

有人可以设置吗?

/约翰

【问题讨论】:

  • 我对 Notes/Domino Designer 了解不多,但您可能想发布一些错误以帮助人们。
  • @Disco3 - 同意,只是受够了它并把它扔回角落;-) 然而,做一个适当的测试实际上也最终找到了解决方案。所以谢谢你的“提醒”;-)
  • 如此真实 - 我经常找到问题的答案,但开始向其他人解释。

标签: java debugging lotus-notes lotus agent


【解决方案1】:

嗯,有时您只需要解释您的问题即可找到解决方案。

在彻底描述问题时,我最终尝试使用 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

}

为了便于测试,我将“打印”命令留在了代码中。显然,您可以将它们从您的真实模板中删除。

另一件可能有助于使其工作的事情是,我更改了配置参数的大小写,以匹配与磁盘上目录完全相同的大写/小写。

/约翰

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-01
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-27
    • 1970-01-01
    相关资源
    最近更新 更多