Как отлаживать агенты Java (подход двухголового зверя)

Начиная с Notes/Domino версии 7, я использовал принципы из книги Боба Балабана «Двухголовый зверь» (http://bobzblog.com/tuxedoguy.nsf/dx/the-2-headed-beast-debugging-domino-java-agents- with-eclipse) для написания агентов Java в Eclipse, которые можно отлаживать! Это работает как шарм - единственное, что мне пришлось скопировать/вставить код из Eclipse в стандартный агент Notes.

С текущей версией Domino Designer для Eclipse (8.5.3 FP2) я попытался посмотреть, смогу ли я использовать ту же настройку для отладки агентов напрямую (как программы Java) в Domino Designer. Кажется, что я могу заставить код работать, однако я не могу заставить его останавливаться на каких-либо точках останова. Сообщение, которое я получаю:

Не удалось установить точку останова в dk.domain.AgentTemplate из-за отсутствия атрибутов номера строки. Измените параметры компилятора, чтобы сгенерировать атрибуты номеров строк.

Я попытался установить конфигурацию отладки на «Остановить в основном». И вроде прекращается. Однако, если я перешагну через него, он запустит весь код, и я не смогу увидеть, где я нахожусь в коде, и, конечно же, я не смогу увидеть ни переменные, ни их значения.

Была выбрана опция в «Настройки» — «Java» — «Компилятор» для «Добавить атрибуты номеров строк в сгенерированные файлы классов». Я не нашел другого варианта компилятора для генерации номеров строк.

Я использую совместимость с Java 1.5 в Designer.

Кто-нибудь смог это настроить??

/Джон


person John Dalsgaard    schedule 18.10.2012    source источник
comment
Я мало что знаю о Notes/Domino Designer, но вы, вероятно, захотите опубликовать некоторые ошибки, чтобы помочь людям.   -  person matt freake    schedule 18.10.2012
comment
@Disco3 - Согласитесь, мне это просто надоело, и я бросил его обратно в угол ;-) Тем не менее, проведение надлежащего теста на самом деле также привело к поиску решения. Так что спасибо за наводку ;-)   -  person John Dalsgaard    schedule 18.10.2012
comment
Так и есть - я так часто нахожу ответ на свою проблему, но начинаю объяснять это кому-то другому.   -  person matt freake    schedule 18.10.2012


Ответы (1)


Ну, иногда вам просто нужно объяснить свою проблему, чтобы найти решение.

Подробно описывая проблему, я в конечном итоге попытался использовать уровень соответствия компилятора JDK 1.6 (в настройках - компилятор Java). И это действительно сработало!!!

Таким образом, создавая агент с такой структурой, вы можете отлаживать агенты Java непосредственно в Domino Designer:

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

}

Я оставил свои команды «печати» в коде для облегчения тестирования. Очевидно, вы бы удалили их из своего реального шаблона.

Еще одна вещь, которая, возможно, способствовала тому, чтобы это работало, заключается в том, что я изменил регистр параметров конфигурации, чтобы они точно соответствовали тому же верхнему / нижнему регистру, что и каталоги на диске.

/Джон

person John Dalsgaard    schedule 18.10.2012