Всё по отладке Java-кода в Лотусе

Тема в разделе "Lotus + Java + LS2J", создана пользователем Dymytry, 24 фев 2010.

  1. Dymytry

    Dymytry Гость

    Граждане, как вы отлаживаете ваши Java агенты в Лотусе? И под веб, и под Нотес.

    (1) Когда запускаю агент в веб то вот такой код в catch:
    Код (Text):
            PrintWriter pw = getAgentOutput();
    e.printStackTrace();

    pw.println("Error: " + e.getMessage());
    pw.println("Error: " + e.getLocalizedMessage());
    не выводит ничего и нигде ни на странице, ни в NotesLog.

    (2) Мне приходится запускать тот же агент под Нотес, смотрю Java Debug Console: мои Exception e.printStackTrace пишут там ошибку, но не указывают строку...

    Печаль меня одолевает!


    И еще, кстати.

    (3) Я ставил на компе Java SDK 1.6 , а какая версия Java у самого Лотуса? Они как бы разные и друг от друга не зависят?

    (4) Если я пишу Java агент для Нотес-клиента и использую там только внутренние классы Java - агент гарантированно может быть запущен на всех машинах где стоит клиент? А если использую там внешние классы?
     
  2. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Dymytry
    Пользую catch(Exception e) {e.printStackTrace();}
    Версия Java зависит от версии клиента, если мне не изменяет склероз 7 - 1.4, 8 - 1.5, 8.5 - 1.6
    По внешним классам советую посмотреть тут: Jar агент
     
  3. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    pw вещь контекстная
    использовать его для вывода эксепшенов - не совсем корректно
    проще цеплять Нотусёвую jvm и Notes.jar к эклипсу, написать свой тестовый класс и там отлаживать...
    при этом не будет агентского вызова и мемберов класса - но это не большая потеря :)
    http://www-01.ibm.com/support/docview.wss?...uid=swg21188789
     
  4. Dymytry

    Dymytry Гость

    Спасибо!
    То есть строку ошибки так никто и не выводит, получается.. Тестовый класс это JUnit? Пока не добрался туда.

    * * *

    В продолжение, а есть ли какая-нибудь разница между выполнением java кода под веб и под нотес?

    У меня вот такая текущая проблема: я создаю XML документ через DOM, при этом следующий код работает и дает результат в нотес и выдает ошибку когда агент запускается под веб:

    Код (Text):
                    org.w3c.dom.Element el = xmlDocument.createElement("date");
    el.setTextContent("xxx");
    documentElement.appendChild(el);
    Причем ошибка странная:
    Именно вот такая. В Eclipse тоже работает.
     
  5. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Exception.printStackTrace() выводит не только номер строки ошибки, но и стек вызовов.
     
  6. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    под веб - агент исполняется на сервере, а унего м.б. др. версия жвм, в кот. этот парсер реализован по-другому
    эта ошибка говорит, что метод el.setTextContent("xxx");
    не реализован
     
  7. vincent_vega

    vincent_vega Lotus team
    Lotus team

    Регистрация:
    2 апр 2005
    Сообщения:
    165
    Симпатии:
    1
    Есть еще такой метод

    http://www.ibm.com/developerworks/ru/doc/l...;S_CMP=SIMPLERS
    "Lotus Domino 7 разработка приложений" (3,33 MB). Пер. с англ. - страница 123.

    Пару раз пытался использовать, но в 80% случаев у меня лотус сваливался, поэтому забил, но может у вас что то получится.
     
  8. Kee_Keekkenen

    Kee_Keekkenen Well-Known Member

    Регистрация:
    5 сен 2006
    Сообщения:
    616
    Симпатии:
    4
    на клиенте можно прикрутить эклипс и в ней отлаживать..
    пишешь агента в лотусе, компилишь, экспортируешь код в файловую систему, настраиваешь порты (8701,8702,8703 для их применения нужна перезагрузка лотуса) в лотусе для джава дебагинга, в свойствах агента, указываешь (галка) компиляция джава кода с дебаг инфой, в эклипсе создаешь проект, в его свойствах подключаешь библиотеку Notes.jar, импортируешь в проект (default package) сохраненный ранее джава код агента..
    далее запускаешь настраиваешь дебагер эклипсе, run -- debug... в закладке remote java aplication--java в поле Host высталяешь 127.0.0.1, Port 8701..
    затем в эклипсе расставляешь брикпоинты, переключаешь в лотус, внем из меню акшн запускаешь агента, после этого тебя выкидывает в дебагер эклипса, а дальше уже по дебагеру лазишь..

    еще пару пунктов забыл..
    1.еще необходимо в notes.ini клиента прописать строку JavaEnableDebug=1
    2. скопировать библиотеку dt_socket.dll из lotus\data\jvm\bin в lotus
     
  9. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    эта схема работает у меня, даже в конфиге, где странно видеть её работающей ;)
    конфига след.:
    - нотуса 7.0.4
    - wine-1.1.39
    - ubuntu 9.10 64 bit
    - эклипса соответственно 64бит
    -Notes.jar дернул от 32бит линуховой 8.5.1, из каталога (она нужна формально - для сборки)
    /opt/ibm/lotus/notes/framework/shared/eclipse/plugins/com.ibm.notes.java.api.win32.linux_1.5.1.20090929-1223
    -jvm проекта - /opt/ibm/lotus/notes/jvm (тоже от 32бит версии линуховой 8.5.1)


    пункт 2. (из инструкции выше) не делал (подозреваю - не для всех версий нотусей это нужно)

    это просто как эксперимент проводил - потому не советую как рабочий вариант ;)

    ИМХО что в такой схеме плохо - синхронизация изменений кода агента

    как уже упоминал - можно "выкинуть" специфичную агенту часть и отлаживать ф-ционал, кот. необходим. Так делал с аплетом, кот. потом юзал в нотусах
    придется только создавать самому сессию, и необходимые параметры передать (задать статически)
     
  10. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    ловля ошибок браузером
    сервер, java агент:
    Код (Text):
        public void NotesMain() {
    java.io.PrintWriter response = null;
    try {
    Session session = getSession();
    AgentContext agentContext = session.getAgentContext();
    // (Your code goes here)
    response = getAgentOutput();
    throw new Exception("але на, это я на");

    } catch(Exception e) { /*если оч. хочеца - можно ловить Throwable*/
    e.printStackTrace();
    if ( response!=null ){
    response.println("content-type:text/html");
    response.println("status:500");
    response.println("Error...");
    e.printStackTrace( response );
    response.flush();
    response.close();
    }

    }
    web-клиент, js:<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">SimpleAjaxHandler</div></div><div class="sp-body"><div class="sp-content">
    (с) Pro JavaScript™ Design Patterns. Authors: Ross Harmes, Dustin Diaz. Publisher: Apress, 2008
    ISBN(s): 1430204958, 9781430204954, 159059908X, 9781590599082
    Код (Text):
    var SimpleAjaxHandler = function() {}; // implements AjaxHandler
    SimpleAjaxHandler.prototype = {
    request : function(method, url, callback, postVars) {
    var xhr = this.createXhrObject();
    xhr.onreadystatechange = function() {
    if (xhr.readyState !== 4)
    return;
    (xhr.status === 200) ? callback.success(xhr.responseText,
    xhr.responseXML) : callback.failure(xhr.status , xhr.responseText);
    };
    xhr.open(method, url, true);
    if (method !== 'POST')
    postVars = null;
    xhr.send(postVars);
    },
    createXhrObject : function() { // Factory method.
    var methods = [ function() {
    return new XMLHttpRequest();
    }, function() {
    return new ActiveXObject('Msxml2.XMLHTTP');
    }, function() {
    return new ActiveXObject('Microsoft.XMLHTTP');
    } ];
    for ( var i = 0, len = methods.length; i < len; i++) {
    try {
    methods[i]();
    } catch (e) {
    continue;
    }
    // If we reach this point, method[i] worked.
    this.createXhrObject = methods[i]; // Memoize the method.
    return methods[i];
    }
    // If we reach this point, none of the methods worked.
    throw new Error('SimpleHandler: Could not create an XHR object.');
    }
    };
    Код (Text):
    var URL = "блаблабла?OpenAgent";
    var callback = {
    success : function(){/*здесь нормальный поток выполнения*/},
    failure: function( status , text ){ alert(text); }
    }
    var ajax = new SimpleAjaxHandler();
    ajax.createXhrObject();
    ajax.request('GET', URL , callback);
    второй вариант - вернуть клиенту нормальный ответ (200), в responseText завернуть json с ошибкой:
    {"errorMessage": "сюда текст ошибки"} либо сразу { throw new Error("...") } и сэвалюэтить в callback.success.
    имхо второй вариант - хуже.

    Добавлено:
    Вы ловите Exception, а у вас кидается Error, который Exception-ом не являеца...
    Блок catch не отрабатывает. Ловите Throwable - туда все прилетит.
     
  11. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
  12. Dymytry

    Dymytry Гость

    Интересен такой вопрос: я обнаружил, что первый запуск моего java агента проходит значительно медленнее, чем последующие!

    С чем это связано?
    Что тут можно поделать?

    Я прочел, что у JSP похоже тоже самое: при первом запуске что-то там генериться. Может, это общее свойство серверных приложений на Java? Как улучшить?
     
  13. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    а первый запуск др. приложений, кот. отнимает время, Вас не смущает? :maybe:
    запускается jvm, создаёт индекс библиотек...
    в 8-ке - вообще всё плохо, там ещё и JIT отключён (в клиенте - точно, на сервере - не знаю)
    я не знаю - есть ли ключи, кот. запустят jvm вместе с доминой, надо гугл спросить :)

    кстати, вспомнил, jvm стартует вместе с http..., а вот по тормозам агентов - не знаю
     
  14. ankass

    ankass Гость

    Подскажите пожалуйста как в дизайнере сделать так чтобы стабильно запускался отладчик Java.
    В хэлпе написана последовательность шагов, но у меня не получается запустить, раньше получалось.
    В итоге выдается ошибка на картинке. Задолбало блин ))
     

    Вложения:

  15. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    А что в details?
     
  16. ankass

    ankass Гость

    В коде стоит
    sleep(10000);

    Иногда все-таки в дебаггер ворваться получается, но четкого объяснения что, зачем и как происходит я не имею.

    В настоящий момент считаю так:
    1. Мы из клиента запускаем например наш агент, при этом иницирируется запуск JVM, и она запущена пока мы застреваем на sleep(10000);
    2. В это время идем в дизайнер и там запускаем ранее созданную конфигурацию для отладки этого агента.
    3. Если все хорошо, то попадаем в отладчике на точку останова после команды sleep(10000), как написано в хэлпе, и радостно отлаживаемся.

    Такая фигня работает неустойчиво у меня почему-то, трачу кучу времени.
     

    Вложения:

  17. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Может sleep уменьшить хотя бы до 5000? За десять секунд до отладчика можно ползком добраться.
     
  18. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    есть пункт - Show Java Debug Console
    рядом с Debug Lotus Script
    в 8.х тоже рядом, но название м.б. другие посмотрел - такие же (тока в меню Tools, а 7-ке File->Tools)

    Добавлено: шобы туды не оазить часто, я такой класс юзаю (для бриджа):
    Код (LotusScript):
    Class ErrorHandlerWJ As ErrorHandler
    Private jSession As JavaSession
    Private jError As JavaError
    Sub New()
    On Error Goto errorhandler
    Set jSession= New JAVASESSION
    ExitFunction:
    Exit Sub
    errorhandler:
    Call ErrorHandler..RaiseError()
    Resume ExitFunction
    End Sub
    Function RaiseError() As String
    Set jError = jSession.getLastJavaError()
    Dim es As String
    If (jError.errorMsg = "") Then     
    es=ErrorHandler..RaiseError()
    Else
    es=GetModuleInfo()+"Error at line " & Erl & ": " & jError.errorMsg
    Print es
    jSession.ClearJavaError        
    End If
    RaiseError=es
    End Function
    End Class
     
  19. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    lmike
    Что этот код делает?:
    Код (Text):
    es=ErrorHandler..RaiseError()
    И ещё ламерский вопрос: как в Java-библиотеке записать код ошибки, строку, на которой она возникла, и текст ошибки, чтобы потом это всё взять в LS? Как минимум нужен нормальный текст ошибки, чтобы выдать пользователю, а для отладки желательны были бы Err и Erl, но в Java-либе.

    Добавлено:
    Кстати LS-класс обработки ошибок генерит такую инфу:
    а консоль показывает такую:
    Какое сообщение тогда верно (предполагаю, что 2-е)? И как сделать, чтобы LS-класс возвращал именно 2-е сообщение?
     
  20. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Для LS2J можно использовать подобную обработку ошибок:
    Код (LotusScript):
    Function SomeFunction(param As String) As String
    'запрос к web-сервису
    On Error Goto ErrorHandler
    On Error 318 Goto Error318

    Dim jSession As JavaSession
    Dim jClass As JavaClass
    Dim jMethod As JavaMethod
    Dim jError As JavaError
    Dim jErrorStackTrace As String

    Set jSession = New JavaSession()
    Set jClass = jSession.GetClass("SomePackage/SomeClass")
    Set jMethod = jClass.GetMethod("SomeMethod", "(Ljava/lang/String;)Ljava/lang/String;")
    SomeFunction = jMethod.Invoke(, param)
    Exit Function
    Error318:
    Set jError = jSession.getLastJavaError()
    jErrorStackTrace = jError.StackTrace
    Call jSession.ClearJavaError()
    ErrorHandler:
    msgbox Error + chr$(10) + jErrorStackTrace + chr$(10) + "line: " + cstr(erl)
    End Function
     
Загрузка...

Поделиться этой страницей